Blog Schröder

Sammlung von Codeschnipseln zu Programmierproblemen.
Daten aus fremden Quellen unterliegen deren Rechten.
Siehe auch: Disclaimer auf www.computer-schroeder.de

Dienstag, 23. Juni 2009

In Datenherkunft von Formularen und Berichten Textteile austauschen

Bei Änderungen an der Datenbankstruktur sollen auch Tabellen- und Feldnamen geändert werden. In Modulen geht das einfach durch STRG + H (Ersetzen). Die in Access-Objekten eingebetteten SQL-Anweisungen werden so nicht erwischt. Hierzu folgende Funktion, die zweckmäßigerweise aus einem Makro (s. Abb.) aufgerufen werden kann.

Argumente:

  1. oldString: das alte Textstück (z.B. "Länderschlüssel")
  2. newString: das stattdessen einzusetzende (z.B. "Laenderschluessel")
  3. findInForms: Ersetze in RecordSource jedes Formulars und Berichts (nur FALSE, falls nicht gewünscht)
  4. findInControls: Ersetze in RowSource aller Listen- und Kombinationsfelder (nur FALSE, falls nicht gewünscht)



Public Function RenamePartInRSources(oldString As String, newString As String, _
Optional findInForms As Boolean = True, Optional findInControls As Boolean = True)
'ersetzt in der Datenherkunft von Form/Control ein Wort durch ein anderes
On Error GoTo Er
Debug.Print "Ersetze " & oldString & " durch " & newString
If oldString = "" Then Err.Raise 10001, , "Parameterfehler oldString"
If newString = "" Then Err.Raise 10002, , "Parameterfehler newString"
If Not (findInForms Or findInControls) Then Err.Raise 10003, , "Parameterfehler findIn*"

Dim AO As AccessObject
Dim F As Form
Dim R As Report

Dim o As String
Dim s As String
Dim i As Integer

For Each AO In Application.CurrentProject.AllForms
DoCmd.OpenForm AO.Name, acDesign, , , acFormEdit, acHidden
Set F = Forms(AO.Name)
If findInForms Then 'in Formular ersetzen
o = F.RecordSource
' Debug.Print F.Name & ": " & F.RecordSource
s = Replace(o, oldString, newString)
F.RecordSource = s
If s <> o Then Debug.Print F.Name & ": " & F.RecordSource
s = ""
End If

If findInControls Then 'in Steuerelement ersetzen
For i = 0 To F.Controls.Count - 1
On Error Resume Next
o = F(i).RowSource
' Debug.Print F.Name & "." & F(i).Name & ": " & F(i).RowSource
s = Replace(o, oldString, newString)
F(i).RowSource = s
If s <> o Then Debug.Print F.Name & "." & F(i).Name & ": " & F(i).RowSource
On Error GoTo Er
s = ""
Next i
End If
DoCmd.Close acForm, AO.Name, acSaveYes
Next AO

For Each AO In Application.CurrentProject.AllReports
DoCmd.OpenReport AO.Name, acDesign, , , acHidden
Set R = Reports(AO.Name)
If findInForms Then 'in Bericht ersetzen
o = R.RecordSource
s = Replace(o, oldString, newString)
R.RecordSource = s
If s <> o Then Debug.Print R.Name & ": " & R.RecordSource
s = ""
End If

If findInControls Then 'in Steuerelement ersetzen
For i = 0 To R.Controls.Count - 1
On Error Resume Next
o = R(i).RowSource
s = Replace(o, oldString, newString)
R(i).RowSource = s
If s <> o Then Debug.Print R.Name & "." & R(i).Name & ": " & R(i).RowSource
On Error GoTo Er
s = ""
Next i
End If
DoCmd.Close acReport, AO.Name, acSaveYes
Next AO
Ex:
Set AO = Nothing
Set F = Nothing
Set R = Nothing
Debug.Print "RenamePartInRSources beendet."
Exit Function
Er: MsgBox "Fehler " & Err.Number & " in Tools.RenamePartInRowSource" _
& vbCrLf & Err.Description
Resume Ex
End Function

Labels: , , , , , , , ,

Donnerstag, 11. Oktober 2007

ASP.NET-Benutzersteuerelement programmgesteuert erstellen

1. Stellen Sie sicher, dass die @ Control-Direktive des Benutzersteuerelements ein ClassName-Attribut enthält, das dem Benutzersteuerelement eine Klasse zuweist, um das Benutzersteuerelement strikt zu typisieren.
<%@ Control className="MyUserControl" %>
2. Erstellen Sie in der Seite, in der Sie mit dem Benutzersteuerelement arbeiten möchten, unter Verwendung der @ Reference-Direktive einen Verweis auf das Benutzersteuerelement.
Beim programmgesteuerten Erstellen eines Benutzersteuerelements steht der ASP.NET-Webseite die strikte Typbindung für das Benutzersteuerelement erst zur Verfügung, nachdem ein Verweis darauf erstellt wurde. Mit folgendem Code wird z. B. ein Verweis auf ein Benutzersteuerelement erstellt, das in der Datei MyUserControl.ascx erstellt wurde.
<%@ Reference Control="MyUserControl.ascx" %>

Hinweis
Verwenden Sie @ Reference, wenn Sie beabsichtigen, das Steuerelement programmgesteuert zu laden.
Verwenden Sie @ Register, wenn Sie der Seite ein Benutzersteuerelement deklarativ hinzufügen.
3. Erstellen Sie mit dem Klassennamen des Steuerelements eine Instanzvariable für das Benutzersteuerelement. Die Klasse ist Teil des ASP-Namespaces.
Protected Spinner1 As ASP.Spinner
4. Erstellen Sie im Code eine Instanz des Benutzersteuerelements, indem Sie die LoadControl-Methode aufrufen.
5. Weisen Sie je nach den Erfordernissen Eigenschaftenwerte zu, und fügen Sie das Steuerelement dann der ControlCollection-Auflistung eines Containers auf der Seite zu.
Hinweis
Wenn Sie dem ControlCollection-Objekt mit der Add-Methode Steuerelemente hinzufügen, werden die Steuerelemente in der Reihenfolge ihrer Verarbeitung in der Auflistung platziert. Wenn Sie ein Steuerelement an einer bestimmten Position in der Auflistung hinzufügen möchten, verwenden Sie die AddAt-Methode und geben die Indexposition an, an der Sie das Steuerelement speichern möchten.

Beispiel
<%@ Page Language="VB" %>
<%@ Reference Control="~\Controls\Spinner.ascx" %>

<script runat="server">
Private Spinner1 As ASP.Spinner
Protected Sub Page_Load(ByVal sender As Object, _
        ByVal e As System.EventArgs)
    Spinner1 = CType(LoadControl("~\Controls\Spinner.ascx"), _
        ASP.Spinner)
    ' Set MaxValue first.
    Spinner1.MaxValue = 20
    Spinner1.MinValue = 10
    PlaceHolder1.Controls.Add(Spinner1)
End Sub

Protected Sub Button1_Click(ByVal sender As Object, _
      ByVal e As System.EventArgs)
    Label1.Text = Spinner1.CurrentNumber.ToString()
End Sub
</script>
<html>
<head id="Head1" runat="server">
  <title>Load User Control Programmatically</title>
</head>
<body>
  <form id="form1" runat="server">
    <div>
      <asp:PlaceHolder runat=server ID="PlaceHolder1" />
      <br />
      <asp:Button ID="Button1" runat="server"
        Text="Button"
        OnClick="Button1_Click" />
      <br />
      <br />
      <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
    </div>
  </form>
</body>
</html>
(Auszug von http://msdn2.microsoft.com/de-de/library/c0az2h86(VS.80).aspx)

Labels: , , ,