ADOStream Leere Zellen

30. April 2007 15:46

Hallo Zusammen,

Mit diesem Befehl:

ADOStream.WriteText(ADORecSet.Fields.Item(j).Value);

Hole ich die Values aus einer Access-DB in den ADOStream.

Mein Problem ist nun, dass eine leere Zelle einen Fehler verursacht.

Wie kann ich denn diese leere Zelle mit einer 0 auffüllen?

ADORecSet.Fields.Item(j).Value = 0;

klappt nicht, da der Typ Variant verlangt wird.

Bin für jeden Tip dankbar,

Gruss
Silvia
Zuletzt geändert von Silvia am 30. Mai 2007 09:58, insgesamt 2-mal geändert.

1. Mai 2007 11:54

[Beitrag aus dem Forum Dynamics NAV 4.xx nach Software-Integration verschoben.]

Gruß, Kai
MSDynamics.de-Team

4. Mai 2007 09:05

hallo,

ich habe immer noch das Leere-Zellen-Problem! :cry: :cry: :cry:

Vielleicht hat ja jemand eine Idee wie man den ADORecSet.Fields.Item(j).Value, in den ADOStream bekommt, wenn er diesen "Wert" der leeren Zelle enthält?

ADOStream.WriteText(ADORecSet.Fields.Item(j).Value);

Anstatt den Value auf 0 zu setzen?

Ich hab sämtliches ausprobiert....ich krieg die leeren... nicht rein!???

Vielen Dank mal,
Gruss
Silvia

4. Mai 2007 09:37

auf 0 setzen hilft eh nur bei numerischen Feldern.
bei Textfeldern hilft vielleicht das Addieren eines Leerstrings.
Da du jetzt nicht geschrieben hast, ob diese Zeile in VBA oder Navision laufen soll, gehe ich erst mal von VBA aus:
Code:
ADOStream.WriteText(ADORecSet.Fields.Item(j).Value & "");


in Navision würde das so aussehen:
Code:
ADOStream.WriteText(ADORecSet.Fields.Item(j).Value + '');


probier's mal, vielleicht geht's ja so....

4. Mai 2007 09:51

ach so ja es soll in Navision laufen...

leider funktioniert das auch nicht, dann kommt die Meldung:
"type conversation is not possible because 1 of the operators contains an invalid type Variant + text"

Der Witz ist, ich bekomme mit dem ...WriteText integer, decimal und text rein nur leer nicht!

4. Mai 2007 09:55

Dann vielleicht so:

Code:
ADOStream.WriteText(FORMAT(ADORecSet.Fields.Item(j).Value) + '');


evtl kannst du das +'' auch weglassen dann....

4. Mai 2007 09:56

...und wenn ich einen Variant einsetze zb.

VariantValue := ' ';
ADOStream.WriteText(ADORecSet.Fields.Item(j).Value + VariantValue);

dann sagt er:
"type conversation is not possible because 1 of the operators contains an invalid type Variant + Variant"

...also ich kann nicht mal einen Variant addieren!?

4. Mai 2007 10:02

jaaa das hatte ich auch schon, dann kommt:
"...ADODB.Stream returned the following message:
Der Vorgang ist für ein geschlossenes Objekt nicht zugelassen" ?

4. Mai 2007 10:04

es gäbe in VB noch die schöne Funktion

--> NZ() die leer in 0 oder einen String umwandelt

aber die geht in Navision nicht. Eine dll, die man einbinden kann, damit VB auch in Navision geht, gibts nicht oder?

4. Mai 2007 10:09

Nee, VB in Nav geht nicht.....

Deiner Fehlermeldung nach ist der ADOStream schon wieder geschlossen....
welche Fehlermeldung kam denn ursprünglich? die hattest du nicht erwähnt.

4. Mai 2007 10:35

die ursprüngliche Fehlermeldung war:
"The call to member WriteText failed. Provider returned the following message: Typekonflikt"

Dazu muss ich sagen, dass ich, nachdem ich über eine For-Schleife alle Daten in den Stream eingelesen habe, die Werte sofort in eine Navision-Tabelle rausschreibe, und zwar so:
...
i := ADORecSet.Fields.Count - 1;
FOR j:=0 TO i DO
BEGIN
ADOStream.Open;
ADOStream.WriteText(ADORecSet.Fields.Item(j).Value);
ADOStream.Position := 0;
FieldValue := ADOStream.ReadText;
ADOStream.Close;

RoofsExport();

END;

ADORecSet.MoveNext;
UNTIL ADORecSet.EOF;
ADORecSet.Close;
ADOConnection.Close;
...
jeh nach Access-Tabelle lege ich dann eine Funktion an, die die Spalten der Navision-Tabelle befüllt, hier ist es RoofsExport() zb so:


CASE j OF
0:
EVALUATE(RecVar2.Zone_ID,FieldValue);
1:
EVALUATE(RecVar2.Wall_ID,FieldValue);
END;

das hat immer funktioniert, mit text, decimal, integer bis ich auf die eben genannte Fehlermeldung stiess. Dann bin ich draufgekommen, dass die nur kommt wenn eine Spalte der Access-Tabelle leer ist, wenn ich diese Spalte in Access testweise mit 0en auffülle ...funktioniert es wieder...

und dann kam die Überlegung, wie bekomme ich jetzt trotz leeren Zellen den Stream gefüllt!?

4. Mai 2007 10:40

..dh. sorry in der for-schleife lese ich ein und schreiben auch gleich wieder raus... :-)

4. Mai 2007 11:17

hast du mal den debugger mitlaufen lassen, bei welcher Anweisung die Meldung mit dem geschlossenen Objekt auftritt?

4. Mai 2007 11:40

jetzt krieg ich die Meldung nicht mehr her...
hab das FORMAT wieder eingesetzt und nun kommt die Meldung:

"This data type is not supportet by C/SIDE. You can access data from any of the following data types: VT_VOID, VT_I2, VT_I4, VT_R2, VT_R8, VT_CY, VT_DATE´, VT_BSTR and VT_BOOL"

Im Debugger zeigt er auf diese Zeile:
ADOStream.WriteText(FORMAT(ADORecSet.Fields.Item(j).Value));

...und sagt j=22, das ist die erste leere Spalte in der Access-Tabelle.

4. Mai 2007 11:52

aaah ich weiss warum diese Meldung mit dem geschlossenen Objekt nicht mehr kommt: hatte ausversehn 2x diese CodeZeile: ADOStream.Close;

...die jetztig bezieht sich dann wohl wirklich auf das FORMAT-Problem...

4. Mai 2007 11:53

ist das Feld denn normalerweise ein numerischer wert?
Wenn ja, kannst du möglicherweise mit evaluate was reissen:
Code:
IF j=22 THEN BEGIN
  IF NOT EVALUATE(varZahl,ADORecSet.Fields.Item(j).Value) THEN
     varZahl:=0;
  ADOStream.WriteText(format(varZahl));
END ELSE
  ADOStream.WriteText(ADORecSet.Fields.Item(j).Value);

4. Mai 2007 13:43

jaaa geeeeeeeil das hat funktioniert!
Cooooooooooool!

Vielen Dank! sensationell! ;-) *hihi*

30. Mai 2007 10:05

Hallo zusammen,

leider ist dieses Problem doch noch nicht ganz behobe:
der

Code:
IF j=22 THEN BEGIN
  IF NOT EVALUATE(varZahl,ADORecSet.Fields.Item(j).Value) THEN
     varZahl:=0;
  ADOStream.WriteText(format(varZahl));
END ELSE
  ADOStream.WriteText(ADORecSet.Fields.Item(j).Value);


funktioniert zwar, aber nun bin ich an dem Punkt, dass ich diese j=22 nicht mehr hardcodiert eintragen will, sondern, dass er einfach alle durchschaut und und bei den vorkommenden leeren Spalten die 0 einträgt.

ich dachte wenn ich dieses "IF j=22 THEN BEGIN" weg lasse, müsste es funktionieren:
Code:
   IF NOT EVALUATE(varZahl,ADORecSet.Fields.Item(j).Value) THEN BEGIN
     varZahl:=0;
  ADOStream.WriteText(format(varZahl));
END ELSE
  ADOStream.WriteText(ADORecSet.Fields.Item(j).Value);


tut es aber nicht ich bekomme wieder einen typkonflikt ich fag mich nur wieso? ich kann doch einfach alles durchlaufen lassen?
ich hab mal wieder einiges probiert .... aber er läuft nicht durch?

hat jemand eine Idee?

Vielen Dank,

Grüsse
Silvia