Über Dataport eine 2.Tabelle füllen

9. Januar 2008 16:25

Hi,

bin Newbie im Bereich der Dynamics/Navision Programmierung.

Hoffe ich nerve nicht zu sehr mit irgendwelchen Laiern-Fragen, aber ich
probier es einfach mal.

Ich habe einen Dataport designed, funktioniert auch alles ganz toll :-)

Nun soll, nachdem die Daten importiert wurden, eine 2. Tabelle mit Daten gefüllt werden. Diese Tabelle dient als LOG, um zu sehen wer, wann, welche Datei importiert hat.

Ich befinde mich nun im OnPostDataItem-Trigger des Dataports.
Ich habe eine Record-Variable auf die o.a. Log-Tabelle eingerichtet, und möchte diese nun füllen.

1. Feld "lfd.Nr", Code10 - Dort soll die letzte Nummer berechnet werden, und der neue Datensatz mit der nächsten Nummer angelegt werden. Dieses Feld ist der alleinige prim.Key der Tabelle.
2. importiert am = CURRENTDATETIME
3. User := UserID;
4. DataportID , diese habe ich wg. Unkenntnis erstmal fix eingesetzt (TableRec.DataportID := '70510';)
5. Filename. Wie kann ich denn übergeben, welche Datei eingelesen wurde?
6.Anzahl der Datensätze. Dort kann ich wohl den Befehl Count benutzen, da bastel ich noch.

Ich habe einfach einen TableRec.Init in den o.a. Trigger geschrieben, die bisher bekannten Werte := gesetzt, und mache dann einen TableRec.MODIFY.

Dennoch wird nichts in die Tabelle geschrieben. Wo liegt hier der Denkfehler?

Vielen Dank für Eure Bemühungen im Vorraus.
Mfg

9. Januar 2008 16:40

Also ich habe sowas ähnliches gemacht. Ich habe es so gelöst.

Eine zweite Record Variable angelegt, mit der gleichen Tabelle. Und das Feld lfd.Nr pro Record um eins hochgezählt.

Code:
IF NOT TableRec2.GET(TableRec."lfd.Nr") THEN
  TableRec.INSERT;


diesen Code anstatt deinem MODIFY

9. Januar 2008 16:44

Ich habe bisher diesen Code:


ImpSnp.INIT;
ImpSnp."lfd. Nr." := '1';
ImpSnp."importiert am" := CURRENTDATETIME;
ImpSnp.User := UPPERCASE(USERID);
ImpSnp.INSERT;

Beim Ausführen bekomme ich nun die Fehlermeldung:

Die Import SNP existiert bereits.
Identifizierte Felder und Werte:
lfd.Nr.='1'.

Die Tabelle Import SNP ist allerdings leer.
Keinerlei Datensätze.

:-(

9. Januar 2008 16:49

Ok, hatte es im falschen Trigger.
Was anfangs fehlte war schlichtweg das INSERT.

Bleiben nun noch die Probleme:

1.Wie berechne ich die lfd. Nummer
2.Wie berechne ich den Dateinamen der Importdatei (*.txt)

Danke für Deine Bemühungen bisher.
Manchmal seh ich den Wald vor lauter Bäumen einfach nicht...

9. Januar 2008 16:53

any1 hat geschrieben:Ich habe bisher diesen Code:
ImpSnp.INIT;
ImpSnp."lfd. Nr." := '1';
ImpSnp."importiert am" := CURRENTDATETIME;
ImpSnp.User := UPPERCASE(USERID);
ImpSnp.INSERT;

Tipp: Schreibe Zeile 4 so:
ImpSnp.User := USERID;

Beim Ausführen bekomme ich nun die Fehlermeldung:

Die Import SNP existiert bereits.
Identifizierte Felder und Werte:
lfd.Nr.='1'.

Die Tabelle Import SNP ist allerdings leer.
Keinerlei Datensätze.


Offenbar rufst du dieses Stück Code mehrfach auf. Wenn dem absichtlich so ist, dann musst du natürlich vorher die Lfd. Nr. jedes Mal hochsetzen.

9. Januar 2008 16:59

Ich rufe diesen Code ausschliesslich hier auf.
Habe nur vorher das Ganze in diversen Triggern des Dataports ausprobiert.

Ich verstehe leider immer noch nicht, wie ich die laufende Nummer berechnen soll.

Wenn es in der Tabelle bereits Datensätze gibt (z.b. 17), sollte der nun eingefügte Datensatz die lfd. Nr. 18 haben.

Ich denke ich muß eine Integer Variable anlegen, diese über den Record füllen lassen, und dann +1 addieren.

Bin nur noch beim Umsetzen leicht am verzweifeln ...

9. Januar 2008 17:00

Also die laufende Nummer ist bei mir ein Integer Wert. Diesen setze ich dann pro Record um eins hoch.

Code:
ImpSnp."lfd. Nr." := ImpSnp."lfd. Nr." + 1;


Vorher solltest du natürlich die letzte Nummer aus der Tabelle holen damit er weiß wo er ansetzen muss.

9. Januar 2008 17:01

Ich denke ich muß eine Integer Variable anlegen, diese über den Record füllen lassen, und dann +1 addieren.


Richtig!

9. Januar 2008 17:07

ok, das habe ich nun hinbekommen:

Code:

IF ImpSnp.FIND('-') THEN
  ImpSnp."lfd. Nr." := ImpSnp."lfd. Nr." +1 ELSE
    ImpSnp."lfd. Nr." := 1;



Wie bekomme ich nun den Dateinamen der importierten Datei übergeben?

9. Januar 2008 17:09

FIND('-') ist denke ich hier falsch. Du benötigst ja den letzten Datensatz. Da würde ich dann ein FIND('+') verwenden.

9. Januar 2008 17:11

Im Dataport gibt es eine Variable, die CurrFile heißt, dort ist ein Member mit dem Filename.

9. Januar 2008 17:15

Ah :-)

Gibt es noch eine Möglichkeit, den Wert ohne den Pfad auszugeben?
Also wirklich nur den reinen Dateinamen...

9. Januar 2008 17:17

Ist der Pfad immer gleich? Dann würd ich die Zeichen des Pfades zählen und diese dann abschneiden.

9. Januar 2008 17:20

Leider nicht.
Es müsste bis zum letzten Backslash abgeschnitten werden.

9. Januar 2008 17:21

Du brauchst nur die Position des letzen Backslashs zu suchen und dann nimmst Du alles rechts davon, das ist dann der Dateiname.

9. Januar 2008 17:23

Die Theorie ist soweit klar.
Nur die praktische Umsetzung scheitert grad an meinen Programmierungskenntnissen...

9. Januar 2008 17:27

Eine Möglichkeit via einer Funktion den Dateiname holen:

Code:
GetDateiName(strPath : Text[250]) DateiName : Text[1024]
DateiName := strPath;
IF STRPOS(DateiName,'\') <> 0 THEN BEGIN
  REPEAT
    FOR i := 1 TO STRLEN(DateiName) DO BEGIN
      IF COPYSTR(DateiName,i,1) = '\' THEN BEGIN
        DateiName := DELSTR(DateiName,1,STRPOS(DateiName,'\'));
      END;
    END;
  UNTIL STRPOS(DateiName,'\') = 0;
END;
EXIT(DateiName);

9. Januar 2008 17:47

Oha,

das' mir doch ein bisschen zu hoch.

Muss ich nich noch irgendwo strPath festlegen?
Habe nun eine Funktion names GetDateiName angelegt.
Innerhalb dieser Funktion dann 2 Text-Parameter.

Und als Return value auch noch Text eingetragen.

Wie hat denn dann der Funktionsaufruf auszusehen?
Ich muß der Funktion ja 2 Text-Werte mitgeben...

9. Januar 2008 17:49

strPath ist ein Parameter. Diesen Parameter füllst Du mit CurrFile.NAME
DateiName ist der Rückgabe-Wert.

9. Januar 2008 17:54

GetDateiName(CurrFile.NAME);
ImpSnp.Filename := Dateiname;

Dateiname habe ich als globale Variable eingetragen, und als Rückgabewert in der Funktion.

Das Feld in der Tabelle bleibt nun leer.

9. Januar 2008 17:58

ImpSnp.Filename := GetDateiName(CurrFile.NAME);

Wie wäre es mit der Variante?

9. Januar 2008 18:00

hrmpf, ich Idiot, hehe.

Das klappt nun.

Vielen Dank für die Hilfe :-)

9. Januar 2008 18:02

Gern geschehen!