[NEWSboard IBMi Forum]
Seite 2 von 2 Erste 1 2
  1. #13
    Registriert seit
    Mar 2006
    Beiträge
    98

    Thumbs up

    Zitat Zitat von Fuerchau Beitrag anzeigen
    SQL optimiert da manchmal unglücklich.
    In obigem Fall wird reine Ganzzahlenarithmetik verwendet.

    Probiere mal verschiedene Varianten per STRSQL:

    2100.0 * 121.0 * 10.0 / 1000000.0

    ggf. ist auch ein Casting erforderlich, e.g.:

    dec(2100, 11, 2) ...


    Es hat geklappt ich habe nur eine division durch 1000000,0 ausgeführt und schon wird mit nachkommastellen gerechnet.
    Ich habe die ganze SQL anweisung immer noch nicht richtig verstanden(FETCH und PREPARE???) Ich habe mich noch mit SQL zu wenig Beschäftigt. Wichtig ist erstmal das es funktioniert. VIELEN DANK Du BIST SUUUUPER

  2. #14
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Du arbeitest hier mit "dynamischem SQL".

    Mit "Declare xxx Cursor for yyy" erstellst du einen SQL-Cursor xxx für ein Statement yyy, also für eine Anweisung, mit dem Namen yyy, an Stelle eines Cursor mit einem "Select".

    Statements müssen an SQL übergeben werden. SQL muss natürlich prüfen, ob die Anweisung korrekt ist und was für einen Typ die Anweisung hat.
    Dafür steht der "Prepare" => Vorbereiten.

    Cursor werden dann ganz normal mit "Open", "Fetch" (entspricht dem read) und "Close" verarbeitet.

    Der Trick an der Sache ist, dass man SQL hier quasi missbraucht.
    Da ausser REXX un ggf. Basic keine dynamischen Rechnenoperationen unterstützen, mache ich mir hier die SQL-Funktionen zu Nutze.

    Das Gegenstück in RPG wäre:

    c/exec sql
    c+ set : myvar = Formel
    c/end-exec

    Die Set-Anweisung geht aber leider nicht dynamisch.

    Alle anderen Anweisungen ausser Select lassen sich mit "execute immediate :mystmt" sofort ausführen.

    Nach dem Prepare ist der SQLCOD auszuwerten um Fehler in der Formel festzustellen.
    In SQLERD steht dann sogar die Position des Fehlers (in 4-byte-Binär) so dass man auch dem Benutzer dann Fehler anzeigen kann.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #15
    Registriert seit
    Oct 2006
    Beiträge
    29

    Habe ein Modul für soetwas

    Ich habe soetwas mal programmiert. Mit Klammerregeln, Punkt-/Strichrechnung, SIN, COS etc. etc.

    Beispiel: (1+4*(17+4))*7+SIN(90)

    Ebenfalls kann eine logische Abfrage inkl. Zeichenkettenoperationen etc. berechnet werden.

    SST("TEST":1:2) = "TE" AND 1=7 OR (2*2=4 AND 7*7=49)



    Das Ganze wird in einem SRVPGM zur Verfügung gestellt und kann sehr einfach aufgerufen werden. Aus jedem ILE/RPG und pfeilschnell.

    Bei Interesse bitte email an fb@bruegge.biz

  4. #16
    Registriert seit
    Sep 2004
    Beiträge
    136
    Zitat Zitat von Fuerchau Beitrag anzeigen
    SQL optimiert da manchmal unglücklich.
    In obigem Fall wird reine Ganzzahlenarithmetik verwendet.

    Probiere mal verschiedene Varianten per STRSQL:

    2100.0 * 121.0 * 10.0 / 1000000.0

    ggf. ist auch ein Casting erforderlich, e.g.:

    dec(2100, 11, 2) ...
    ...ist das echt die einzige Möglichkeit, kann man das nicht per set option erzwingen?

    Mit freundlichen Grüß
    Kai Schummer

  5. #17
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Da gibts leider keine Option.
    SQL verwendet da die einfache NK-Regel aus der Methematik.
    Haben 2 Werte keine Nachkomma, so ist das Ergebnis eben auch ohne NK.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #18
    Registriert seit
    Sep 2004
    Beiträge
    136
    naja bei einer Division kann es trotzdem vorkommen. MYSQL z.B macht das meiner Meinung nach richtig.

  7. #19
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    richtig ist erst einmal, dass MySQL das anders macht; der SQL Standard fordert jedoch enge Typbindung, sprich: mit Integer Zahlen wird Integer gerechnet (nämlich abschneiden), mit Decimal wird kaufmännisch gerechnet (nämlich runden), mit Float wird Fließkomma gerechnet (nämlich (1/3 * 3) <> 1) und im Mix wird entsprechend hoch gecastet (von int -> dec -> float). Letztlich verlässlich ist das ganze beim rechnen mit Literalen nicht wirklich, deshalb sollte man sowas auch vermeiden und die Auswertung von Ausdrücken mit SQL ist ein Anwendungsmissbrauch, der sich mit unerwarteten Ergebnissen rächen kann (bei jeder Datenbank!!!), also was für Leute, die noch zusätzliche Probleme suchen.

    D*B

    Zitat Zitat von Xanas Beitrag anzeigen
    naja bei einer Division kann es trotzdem vorkommen. MYSQL z.B macht das meiner Meinung nach richtig.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. String mit Returns in iSeries Datenfeld speichern
    By e_sichert in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 07-11-06, 15:25
  2. String zusammenstellen
    By edig in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 07-07-06, 10:51
  3. Systemdatum nach String
    By codierknecht in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 03-07-06, 15:25
  4. String mit HexInhalt muss als Hex-Wert in Variable
    By cheffe1008 in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 16-05-06, 07:45
  5. RPG-ILE: Alpha --> Numeric
    By TomWaf in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 12-05-06, 09:07

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •