Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: robertpp am 08.03.06 - 11:27:23
-
Hallo,
Ich hab ein Problem mit einem Zahlenformat. Wenn ich mich mit ODBC auf unsere AS400 verbinde dann bekomme ich immer bei:
Result.GetValue("AGSTZT") das falsche Format.
Eigentlich sollte ich zb. 0,45 zurückbekommen ich bekomme aber immer nur ,45 oder ,6 zurück und dann will ich das in ein Feld schreiben und dann passt das Format eben auch nicht?
Kann mir jemand mal helfen damit ich die richtige Zahl bekomme?
danke robert
-
Ich hab das jetzt nicht getestet, aber versuch mal mit Hilfe eines
CINT(Result.GetValue("AGSTZT"))
den Wert an das Feld zu übergeben.
Grüsse
Holger
-
cint liefert einen Integer
cdbl(Result.GetValue("AGSTZT")) konvertiert in eine Dezimalzahl
Hubert
-
Ups, stimmt... :-[
-
Das mit Cdbl hab ich auch schon probiert da steht in der Variabel beim debugger trotzdem nur ,45
robert
-
Machst du jetzt ODBC am Client oder läuft der Agent am Server?
Welchen Typ hat die Variable wenn du es in einen Variant schreibst, bzw. Welche Fehlermeldung bekommst du?
Handelt es sich um ein gezontes oder ein gepacktes Feld auf der AS/400?
Fragen über Fragen.
Grüße
Ralf
-
Das mit Cdbl hab ich auch schon probiert da steht in der Variabel beim debugger trotzdem nur ,45
Das ist ja auch vollkommen korrekt. Im FrontEnd (Deinem Feld im Dokument also) steht dann trotzdem 0,45, wenn dies ein Zahlenfeld ist.
Bernhard
-
Hallo Bernhard!
Ja wie gesagt, mich würde auch interessieren was für ein Problem der Frager überhaupt hat. Wie eben noch ein paar Fragen.
Btw. Am Server gibt es leider ein Bugs im AS/400 Domino und da ist dann ODBC nicht so wirklich gut. Bin schon öfters auf die Nase geflogen, dass was im Client wunderbar funktioniert am Server dann nicht so wirklich klappt. Verwende deshalb nur noch Java für solche Dinge, denn das läuft auf der AS/400 wirklich spitze und man kann da dann auch noch alles viel performanter machen. Kommt aber ein wenig auf den Anwendungszweck an.
Grüße
Ralf
-
Wir hatten auch mal ähnliche Probleme mit ODBC-Zugriffen auf die AS/400. Wenn ich mich richtig erinnere, hatten wir den Zugriff über einen Standard-ODBC-Treiber konfiguriert. Dabei sind z.B. deutsche Sonderzeichen nicht sauber mit rübergekommen.
Wir haben dann letztendlich Client Access auf dem Server installiert und den dann mitinstallierten Client Access ODBC-Treiber benutzt. Damit wurden die Daten dann sauber übertragen bzw. ausgelesen.
-
Also es ist so das ich das ganze auf dem Server mache wo Client Access installiert ist. Per agent mit runonserver tut das ganze soweit das ich die Daten bekomme nur eben ist das Feld noch falsch gefüllt.
@Bernhard: dem Thema mit Zahlenfeld muss ich morgen nochmals genauer nachgehen. Derzeit ist es keines aber es steht auch im Feld nicht ,45 drinnen sondern nur 45
robert
-
...aber es steht auch im Feld nicht ,45 drinnen sondern nur 45 ...
Das ist jetzt aber eine gänzlich neue Situation ...
Bernhard
-
Hallo Robertpp!
Geh bitte kannst du das Problem nicht etwas genauer beschreiben. Du sagst, du lässt es auf dem Server laufen. Hallo was für ein Server. Normalerweise müsste man annehmen AS/400 aber dann schreibst du von Client Access? Ist der Server nicht die AS/400?
Weiters hast du meine ganzen anderen Fragen elegant übergangen. Als erste musst du mal schauen welcher Art das Feld auf der AS/400 ist. Feldtyp usw. Ist es auf der AS/400 überhaupt ein numerisches Feld?
Grüße
Ralf
-
Guten Abend,
So jetzt mal mit mehr Zeit etwas genauer!
Es ist so: Es ist ein normaler Windows2000 Server auf dem der LoNo Server läuft oder dort ist eben Client Access installiert mit einem ODBC Treiber.
Wenn ich auf der As400 ein Query direkt auf die Tabelle mache dann sehe ich dort zb. 0,45 oder 1,20 oder 0,6 stehen.
Das ganze läuft dann so: Teilenummer in Frontend-doc eingeben. Die wird dann in ein Hintergrund-doc geschrieben und gespeichert. Dann wird der Agent mit agent.RunOnServer(hdoc.NoteID) gestartet sodass er am Server läuft weil nur am Server die ODBC-Verbindung eingerichtet ist. Der Agent holt das "hdoc" und die Teilenummer und dann eben auf die Tabelle und hier mach ich dann folgendes:
Select auf Teilenummer in Tabelle;
Set ioPartTime = hdoc.GetFirstItem( "oPartTime" ) was zu Beginn ja leer ist.
voPartTime = Cdbl(Res.GetValue("AGSTZT")) dan holen des Wertes egal ob ich Cdbl oder Cstr mache es ist immer ,45
dann:
If ioPartTime Is Nothing Then
hdoc.oPartTime = voPartTime
Else
Call ioPartTime.AppendToTextList( voPartTime )
end if
und am Ende steht im Feld immer 45. Es sollte egal ob es ein nummerisches Feld ist oder ein Text Feld ist aber trotzdem irgendwann mal das Komma erscheinen das tut es aber nicht. Es ist noch zu sagen dass das Feld ein Multivalue Feld ist. Bei mehreren gefunden Einträgen wird der weitere Wert angehängt.
Wenn ich das ganze Debugge dann läuft das ganze ja mit der lokal eingetragener ODBC-Verbindung und ich sehe, dass die Variable auch nur ,45 oder bei cstr ",45" steht. Also es macht keinen Unterschied zwischen Server und Clientseitiger Ausführung.
danke robert
-
Call ioPartTime.AppendToTextList( voPartTime )
Ergo schiebst Du das Teil in ein Textfeld. Irgendwie hätten wir das jetzt einfacher haben können ;).
Hole Dir den Wert, den Du via ODBC holst, vorab in eine Zwischenvariable (die hast Du ja schon).
Ich vermute, der Datentyp ist dann Text und beinhaltet ",45".
Wenn Du für ursprüngliche Zahlen trotzdem Text als Ziel im NotesDocument behalten willst, dann prüfe jetzt einfach, ob Deine Zwischenvariable mit "," beginnt. Wenn ja, setzte "0" davor.
Besser wäre sicherlich, das Datenformat beizubehalten und statt dessen den mit Cdbl gewandelten Wert mit ArrayAppend an das bestehende Item (so vorhanden) anzuhängen.
Dass Dein führendes Komma verloren geht, liegt an den Feldtrennzeichen im FrontEnd (Felddefinition) ...
Ich hoffe, ich konnte mich zu später Stunde noch verständlich ausdrücken ;D
Bernhard
-
Hallo Bernhard,
Kann durchaus passieren zu dieser Zeit aber es war alles klar ausgedrückt, Aber:
Zwischenvariable --> stimmt das hab ich gemacht --> Wert stimmt auch ist dann ",45" Was ich jetzt(morgen) ausprobieren muss ist, wenn die Zahl zb 1,2 ist.
Mir ist in diesem Fall eigentlich egal in welchem Format das ganze dann vorliegt.
Bei Cdbl(Res.GetValue("AGSTZT")) bekomm ich als Ergebnis in der Variable ,45
Wie kann ich dem Feld bei Set ioPartTime = hdoc.GetFirstItem( "oPartTime" ) sagen das es ein Number-Feld ist? Ich hab keine Maske dazu für computewithform?
Das Feldtrennzeichen ist aber nur dann definiert wenn das ganze ein Number Feld ist und derzeit ist es aber "leider" als Text-Feld hinterlegt, deshalb ist es so unerklärlich.
-
Wie kann ich dem Feld bei Set ioPartTime = hdoc.GetFirstItem( "oPartTime" ) sagen das es ein Number-Feld ist? Ich hab keine Maske dazu für computewithform?
Masken sind eigentlich in NotesDBs sowieso entbehrlich (wenn nur nicht die User wären ;D).
dblValue = Cdbl(Res.GetValue("AGSTZT"))
doc.YourTargetItem = dblValue
... und es ist ein Item mit numerischen Inhalt. Ganz einfach.
ArrayAppend funktioniert genauso:
doc.YourTargetItem = ArrayAppend (doc.YourTargetItem, dblValue)
Schau Dir das mal an. So in einer Spiel-DB ohne jegliches ODBC-Geraffel - nur diese Funktionalität. Auf die erforderlichen Abfragen wegen Zulässigkeit und ErrorHandling habe ich hier verzichtet - das ist ja eh klar.
Bernhard
Bernhard
-
Ok danke Bernhard, werde mich dann morgen mit einem frischen Kopf damit befassen und hoffe das es morgen dann klappt.
Sonst muss ich sagen so ein runonserver mit übergabe eines Doc's und hineinspeichern und dann im Frontend wieder auslesen des doc ist eine feine Sache. Du ersparst dir echt das ganze einrichten von ODBC-Verbindungen clientseitig.
robert
-
Dann sag' ich mal "Viel Glück", Robert. Solange Du tatsächlich ",45" als Wert zurückbekommst, ist es wirklich ein leichtes, daraus eine "normal lesbare" Zahl wie 0,45 zu machen. Wenn Du da durch bist, wirst Du über den Trödel von heute nur noch lächeln. Man muss eben nur mal gemacht und verstanden haben. Irgendwann ist immer das erste Mal. Wer gut ist, erlebt das sein Leben lang ;)
Bernhard
-
Guten Morgen, ;D
So jetzt passt das mit dem ,45
Ich schreib es jetzt in ein Number-Feld und es wird richtig dargestellt. (mit 0 am Beginn)
Ein kleines Problem hab ich jetzt noch:
Wenn das Feld noch nicht existiert dann kann (muss ich den ersten Wert) ja mit
valuedbl =Cdbl(Res.GetValue("AGSTZT"))
if hdoc.oPartTime(0) = "" then
pdoc.oPartTime = valuedbl
else
....
das Feld setzten.
Wenn aber die erste Zahl im Feld steht dann kann ich nicht mehr abfragen = "" weil es ja kein Text-Feld ist damit ich dann mit
pdoc.oPartTime = Arrayappend (pdoc.oPartTime, valuedbl)
den weitern Wert anhängen kann?
Wie kann ich das noch lösen?
-
Sowas fange ich wie folgt ab:
dim item as NotesItem
set item = pdoc.GetFirstItem( "oPartTime" )
valuedbl =Cdbl(Res.GetValue("AGSTZT"))
if not (item.Type = NUMBERS) then
pdoc.oPartTime = valuedbl
else
...
oder so:
valuedbl =Cdbl(Res.GetValue("AGSTZT"))
if not IsNumeric(hdoc.oPartTime(0)) then
pdoc.oPartTime = valuedbl
else
Andreas
-
Danke Andreas,
Nach Variante zwei geht es bei der ersten müssten noch eingebaut werden ob das Feld existiert da es ja vorher nicht existiert.
Also nochmals danke für die Hilfe.
schönen verschneiten Tag noch...
Robert