Announcement

Collapse
No announcement yet.

ADO: Parameter werden von Delphi nicht zugewiesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ADO: Parameter werden von Delphi nicht zugewiesen

    Hallo,

    ich benutze Master-Detail-Konstellationen mit TAdoQuery.
    Wenn ich in der Detailtabelle einen Parameter mehrmals benutze wie z.B.

    "where KundenGroup_ID< :Group_ID or FirstGroup_ID = :Group_ID"
    (nur ein dummes Beispiel, das SQL ist wesentlich komplexer inkl. unions und bedingt die mehrfache Verwendung einer Mastertabellenspalte)


    bekomme ich keine Ergebnisdatenmenge bzw. den Fehler "Parameter object is improperly defined. Inconsistent or incomplete information was provided".
    Nach verschiedenen Suchstufen bekam ich heraus, dass in den Sourcen von Delphi eine buggige Implementation der Grund zu sein scheint: In der ADODB.pas von D7 (in D2007 auch) findet man

    procedure TCustomADODataSet.SetParamsFromCursor;
    var
    I: Integer;
    begin
    if MasterDataLink.DataSource <> nil then
    for I := 0 to MasterDataLink.Fields.Count - 1 do
    with TField(MasterDataLink.Fields[I]) do
    Parameters.ParamByName(FieldName).Assign(MasterDat aLink.Fields[I]);
    end;


    Damit wird nicht jeder Detail-Parameter belegt. Abhilfe könnte schaffen:

    procedure TCustomADODataSet.SetParamsFromCursor;
    var
    I: Integer;
    begin
    if MasterDataLink.DataSource <> nil then
    for I := 0 to Parameters.Count - 1 do
    Parameters[i].Assign(MasterDataLink.FieldByName(Parameters[i].Name));
    end;


    Ich habe bisher keinen Ansatzpunkt für ein Workaround gefunden. Ich möchte gern die (fehlenden) Parameter vor einem "Open" korrekt belegen. Das Ereignis "BeforeOpen" der Detaildatenmenge kann nicht genutzt werden, da es bei Datensatzänderungen der Master-Source nicht anzieht.

    Hat jemand eine Idee - Wer kann helfen?

  • #2
    Kopiere die ADODB.pas in dein Anwendungsverzeichnis (oder sonstiges Dxx-Fix-Verzeichnis), führe deinen Patch durch und lass die Anwendung neu übersetzen. Das einzige was nicht mehr geht ist die verwendung von Runtimepackages.

    Comment


    • #3
      Vielen Dank für die schnelle Antwort.

      Ein Test zeigte, dass es in dieser Quelle an noch einer anderen Stelle ein Problem gibt, aber dann gings. Für kleinere (ohne Runtime-P) Projekte eine passable Lösung, denke ich.

      Leider ist das jetzige Projekt etwas größer und arbeitet bereits mit Runtimes, da auch Module in Packages ausgegliedert sind. Dafür geht das wirklich nicht...

      Könnte man vielleicht eine (interne) Ereignisbehandlungsroutine nutzen? Wobei, wie gesagt, BeforeOpen ausscheidet...

      Danke schon mal im voraus für weitere gute Ideen!

      Comment


      • #4
        Originally posted by C Hoffmann View Post
        Leider ist das jetzige Projekt etwas größer und arbeitet bereits mit Runtimes, da auch Module in Packages ausgegliedert sind. Dafür geht das wirklich nicht...
        Dann solltest/kannst du dir dein eigenes ADO-Packages pasteln und gegen dieses Compilieren/Linken. Du müsstest schauen welche Units im Orginal-Package verwendet werden so das du die gleichen verwendest.

        Comment

        Working...
        X