PDA

View Full Version : manuelle Dateiverknüpfung (bzw. eine Kind-Datei für zwei Eltern)



Carsten
12-Aug-2012, 01:25 PM
Hallo,

ich versuche gerade ein Programm zu schreiben, bei dem ich auf alte DF2.3b-Dateien aufsetzen darf. Bei einer Neugestaltung der Dateien würde das heute vermutlich anders gehen.....

Mein Problem:
Ich möchte ein Memo (Textblock) mit zwei verschiedenen Header-Dateien (DokuHeader + FileHeader) verbinden. In der Memo-Datei gibt es das Feld 'Memo.DateiTyp', welches entscheidet wohin der Datensatz gehört (D=DokuHeader / F=FileHeader). Eine Dateiverknüpfung in Dataflex gibt es nicht, da ich nicht weiß wie ich das mit dem unterschiedlichen Dateityp (D oder F) hinbekomme.

Hier habe ich die Dateistruktur skizziert:
5355

Hier die Maske:
5356

Ich erhalte im DokuHeader-DataDictionary mit 'Procedure OnNewCurrentRecord ...' den Aufruf des entsprechenden Memo-Datensatzes. Im Buffer ist er vorhanden, leider bekomme ich ihn nicht in die Maske.


Object oDokuHead_DD is a cDokuHeadDataDictionary

Procedure OnNewCurrentRecord RowID riOldRowId RowID riNewRowId
Number nRecNumKdSta
Handle hoDD

Forward Send OnNewCurrentRecord riOldRowId riNewRowId

If (not(IsSameRowId(riOldRowId,riNewRowId) )) Begin

// WIESO geht das hier nicht ??????? --------------------------------
// Send Clear of oMemo_DD
// Move "D" to Memo.DateiTyp
// Move DokuHead.IdNr to Memo.IdNr
// Send Find of oMemo_DD EQ 1
// If (Found) Begin
// Showln "gefunden:" Memo.DateiTyp " / " Memo.IdNr
// End
// Else Begin
// Showln "kein Datensatz Memo"
// End
// --------------------------------------------------------------------

Clear Memo
Move "D" to Memo.DateiTyp
Move DokuHead.IdNr to Memo.IdNr
Find eq Memo by Index.1
If (Found) Begin
Showln "gefunden:" Memo.DateiTyp " / " Memo.IdNr " / " Memo.Textblock
End
Else Begin
Showln "kein Datensatz Memo"
End

End
End_Procedure

End_Object // oDokuHead_DD

(Außerdem ist mir auch noch nicht klar, wieso der auskommentierte Teil mit 'Send Clear of oMemo_DD' nicht funktioniert. Nur meine alte Programmiertechnik ruft den korrekten Datensatz auf. Vielleicht ist auch hier das Problem???)

Das ist mein Ergebnis:
5357

Jeder Tipp ist herzlich willkommen :)
Danke
Viele Grüße
Carsten

P.S: Ich habe ein Workspace als 'Minimalbeispiel' angehängt. Vielleicht ist es so einfacher?

Vincent Oorsprong
13-Aug-2012, 01:29 AM
Carsten,

Wenn Sie DD_DEBUG.DG oder DD_OperationChecker.Pkg anbinden dan sollen Sie sehen dass die Clear ein fehler rapportiert. Innerhalb ein DD action (DD sind beshafigt) ist ein neue activitat nich zugelassen.

Ich denke dass es bei dir um ein 1:1 relation geht. Wann dass so ist dan ist ein DDO verknupfung (Set DDO_Server) und ein Auto_Fill_State genug.

Carsten
13-Aug-2012, 04:31 AM
Hallo Vincent,
das Einbinden von DD_DEBUG.DG ist toll (kannte ich noch nicht), eine Fehlermeldung kann ich aber nicht finden.

Eine DDO-Verknüpfung wäre mir auch lieber, doch fehlt mir das Feld 'Typ' in der Datei DokuHead um eine funktionierende Relation zu erstellen.

So sieht die Relation aus, wie ich es (bisher) machen kann (ohne 'memo.Typ')
5359

Der Index bei Memo ist:
Memo.Typ (D für DokuHead / F für FileHead)
Memo.IdNr

Kann ich 'memo.typ' irgendwo / irgendwie mit Programmzeilen dazu mogeln???

Viele Grüße
Carsten

Vincent Oorsprong
13-Aug-2012, 06:48 AM
Carsten,

Die checkbox "Report DD reentrance errors" must anschaltet wurden.

Das typ kan mit eine constraint in Die DDO gefilttert wurden.

Note: Haben Sie dass Discovering VDF buch gelesen? Es ist ubersetzt in Deutsch. Contact Matthias Burkhardt wann Sie dass kaufen wolte.

Carsten
13-Aug-2012, 02:14 PM
Hallo Vincent,

die Checkbox war immer gesetzt, aber ich finde keine Fehlermeldung bzw. kann sie nicht als Fehler erkennen.


Text aus Misc nach Clear_all bzw. Clear
Current DDO Container = OERFASSEN03 441 OMAIN.OCLIENTAREA.OERFASSEN03

Protect_Key_State = True
Cascade_Delete_State = True

Required Server Files = 0

Required Client Files = 1
102 - DokuPos

Required Other Files = 1
103 - SystDat - Lock on all

Attached DDO Server DDO = 0

Attached DDO CLient DDOs = 1
455 - ODOKUPOS_DD 102 - DokuPos

Valid Save Structure = Yes
Valid Cascade Delete Structure = Yes
Valid No Cascade Delete Structure = Yes

Attached DEOs = 14
461 - ODOKUHEADIDNR
463 - ODOKUHEADBEZEICHNUNG
465 - ODOKUHEADTEXTBLOCK (**Not XDEO)
469 - OTABDIALOG.OTABPAGE1.ODOKUHEADLZTAENDDATUM
471 - OTABDIALOG.OTABPAGE1.ODOKUHEADLZTAENDZEIT
473 - OTABDIALOG.OTABPAGE1.ODOKUHEADLZTAENDUSER
476 - OTABDIALOG.OTABPAGE2.ODOKUHEADTERMINDATUM
478 - OTABDIALOG.OTABPAGE2.ODOKUHEADTERMINZEIT
480 - OTABDIALOG.OTABPAGE2.ODOKUHEADTERMINUSER
483 - OTABDIALOG.OTABPAGE3.ODOKUHEADANGELEGTDATUM
485 - OTABDIALOG.OTABPAGE3.ODOKUHEADANGELEGTZEIT
487 - OTABDIALOG.OTABPAGE3.ODOKUHEADANGELEGTUSER
489 - ODETAILGRID
582 - OMEMO_IDNR

Extended Field Attributes
Field Type Valid Values
-----------------------------------------------------------------------------------------------------------
Recnum 0 None
IdNr 0 None
Bezeichnung 0 None
Textblock 0 None
AngelegtDatum 0 None
AngelegtZeit 0 None
AngelegtUser 0 None
LztAendDatum 0 None
LztAendZeit 0 None
LztAendUser 0 None
TerminDatum 0 None
TerminZeit 0 None
TerminUser 0 None



Wie ich die feste Eigenschaft 'D' oder 'F' in constraint mit angebe, habe ich trotz einiger Versuche nicht herausgefunden. Constraint im DD kann ich in DokuHead oder memo unterbringen. Ich kann zusätzlich eine Relation in der Datei erstellen (aber nur unvollständig, da Typ fehlt) oder ich kann sich auch nicht miteinander verbinden. Auch Versuche mit Set_Relate die Verknüpfung selbst zu erstellen haben bei mir nicht das gewünschte Ergebnis gebracht.

Das deutsche Buch habe ich neben mir liegen, doch leider ist es zum Nachschlagen nicht so gut geeignet, da man ziemlich lange sucht bis die entsprechenden Stellen gefunden sind. Das Buch als PDF mit Suchmöglichkeit wäre hier einfacher. Beispiel: Anzeigen der Daten im Datensatzpuffer in der Maske. Nach was suche ich im Buch?

VDF ist sehr mächtig und da ist es als nicht ganz einfach auf eine Lösung zu kommen, vor allem wenn man mehr möchte als Standard.

Viele Grüße
Carsten

Vincent Oorsprong
14-Aug-2012, 03:20 AM
Carsten,

Die folgenden DDO Struktur funktioniert (getestet in Ihrem minimalbeispiel)

Object oMemo_DD is a cMemoDataDictionary
Set Auto_Fill_State to True

Procedure OnConstrain
Constrain Memo.DateiTyp eq 'D'
End_Procedure
End_Object

Object oDokuHead_DD is a cDokuHeadDataDictionary
Set DDO_Server to oMemo_DD
End_Object // oDokuHead_DD

Object oDokuPos_DD is a cDokuPosDataDictionary
Set DDO_Server to oDokuHead_DD
Set Constrain_File to DokuHead.File_Number
End_Object // oDokuPos_DD

Carsten
14-Aug-2012, 04:54 AM
Hallo Vincent,
vielen Dank für die anhaltende Unterstützung :)

Ich muss noch lernen, wie ich meine Problemstellung klarer darstelle. Das mit Constrain funktioniert, klar, das ist so auch gut beschrieben im deutschen Buch.

Doch ich wollte eine automatische Verknüpfung zwischen den 2 Dateien DokuHead und Memo, d.h. wenn ich in DokuHead blättere, ändern sich entsprechend (automatisch) die Memo-Eingabefelder.

Hier skizziert:
5361

Das wäre auch kein Problem, wenn ich das Kennzeichen Memo.typ auch in der DokuHead-Datei hätte. Habe ich aber leider nicht.

Vielen Dank
Carsten

Vincent Oorsprong
15-Aug-2012, 06:56 AM
Carsten,

Die auto_fill_state tut dies... oder?

Carsten
15-Aug-2012, 08:22 AM
Hallo Vincent,

bei mir nicht :-(

Aber woher soll sie es auch wissen? Es gibt keine Datei-Relation.

5366

Aber auch mit Relationen 'Memo -> DokuHead' oder 'DokuHead -> Memo' hatte ich keinen Erfolg auf AutoFill.

Liegt der Erfolg hier nicht im manuellen Erstellen einer DateiRelation, bei der etwas flexibler das fehlende Bindeglied ('MemoTyp = "D / F") fest einprogrammiert werden kann?

Viele Grüße
Carsten

Carsten
15-Aug-2012, 04:06 PM
Ich habe mein Ziel erreicht !!!
Eine Dateiverknüpfung OHNE Datenbank-Relationship mit 'hinzuprogrammierter' Eigenschaft, d.h. zwei Datentabellen miteinander verknüpfen, die nicht direkt zueinander passen:

5367

Fündig geworden bin ich hier, bei einer Frage meines Namenskollegen :) im letzen Post #9
http://support.dataaccess.com/Forums/showthread.php?47743-What-happens-in-the-quot-Request_Find-quot-procedure-(DD)

Es gibt ab Version 17.0 die Events OnPreFind und OnPostFind.
Damit kann man Dateioperationen machen ohne "Data Dictionary Improvements", d.h. ohne Aufrufen einer DD-Operation innerhalb einer DD-Operation, was nicht erlaubt ist.
(siehe auch "Entdecken Sie Visual Dataflex, Version 17.Feb.2010, deutsch", Seite 449, Kapitel 23.9 Re-entrance der Data Dictionaries)

Leider (?) musste ich dazu das Update von V16.1 auf V17 machen.
Aber jetzt habe ich eine andere Fehlermeldung, die ich nicht zuordnen kann und evtl. mit dem Update zusamenhängt.
5368

Na das Leben könnte ja so schön einfach sein ... aber vielleicht wäre es dann langweilig.... :)
Hat jemand eine Idee?

Vielen Dank
Carsten



Im Anhang noch das Minimalbeispiel für VDF 17.0

Matthias
17-Aug-2012, 01:55 AM
Ich würde einfach mal auf den Debug-Knopf drücken, eine Zeile später einen Breakpoint setzen und dann das Programm an dieser Zeile anhalten lassen. Im Fenster vom "Call Stack" lassen sich dann alle Messages finden, die nacheinander abgearbeitet wurden, bis es zum Fehler kam. In der ersten eigenen Methode/Aufruf ist dann meist auch die Ursache des Problems zu finden.

Gerne können wir uns das auch am 4. September in Friedrichsdorf beim Support Workshop anschauen! Dort gibt es auch noch viel mehr Informationen und man kann auch aus den Fragen der anderen Teilnehmer eine Menge lernen :)

Viele Grüße
Matthias Burkhardt