602SQL-Úplná dokumentace Index  

Vytváření aplikací 602XML+602SQL+PHP - příklady

Stránka s příklady navazuje na rozbor situace uvedený zde.

Příjem XML dat pro získání hodnot PHP proměnných

Uživatel odešle formulář, z něhož skript potřebuje pro další činnost hodnotu elementu ID_PRODEJCE a DATUM. Použije se vhodně navržený analytický importní DAD (vedoucí pouze do klientských proměnných _ID_PRODEJCE a _DATUM) a XMLAPI funkce wb_import_from_XML_buffer.

  ...
  $xml_data = $GLOBALS["HTTP_RAW_POST_DATA"];  // PHP globální proměnná obsahující XML data

  $hostvars=array(
    // první proměnná se jmenuje _id_prodejce
    "_id_prodejce" => array(
        // je typu Integer
        "type" => ATT_INT32,
        // je to OUT proměnná
        "out" => TRUE,
        "value" => null
    ),
    // druhá proměnná se jmenuje _datum
    "_datum" => array(
        // je typu Date
        "type" => ATT_DATE,
        "out" => TRUE,
        "value" => null
    )
 );

  wb_import_from_XML_buffer($connection, "*prodejce_imp_prom", $xml_data, $hostvars);

  if($hostvars["_id_prodejce"]["value"]==null){                           // proměnna se nenaplnila
   echo ' Id nebylo zadano.';                  // vypsat na std. vystup info pro 602XML Filler
   exit;                                       // nema cenu dal pokracovat
  }
  ...

DAD prodejce_imp_prom pro tento příklad musí být navržen takto:

Odeslání XML dat v jednom požadavku s příjmem

Poměrně běžnou situací je potřeba v rámci jediného HTTP požadavku Filleru XML data odeslat i přijmout nová (tedy z hlediska 602SQL jedním DADem přijmout a druhým odeslat). Typicky se jedná o situaci, kdy uživatel vybere např. z číselníku unikátní záznam a tlačítkem doplní záhlaví formuláře hodnotami z tohoto záznamu a dále s formulářem pracuje.

Ze zadání je zřejmé, že na straně 602SQL jsou třeba dva DADy, první - analytický vedoucí do proměnných, který přijme XML od Filleru, vytáhne z dat unikátní hodnotu a uloží do proměnné, zavolá druhý (syntetický výstupní) DAD, který je parametrizován právě touto proměnnou a výstup tohoto DADu se vrátí do Filleru, který se těmito daty překreslí.

Pro tento typický případ existuje postup, jak výsledku dosáhnout bez zbytečného programování předávání parametrů uvnitř skriptu (které je samozřejmě také možné). Technologie DAD dovoluje vytvořit tzv. zřetězený DAD, tedy dvojici DADů, která vyhovuje výše uvedenému zadání. Jako URL požadavku lze pak využít 602SQL WebXML rozhraní ve tvaru:

http[s]://<host_name>/[<path>/]602.php/<server_name>/<schema_name>/DAD/dad_1

kde dad_1 je jméno prvního DADu z dvojice tvořící zřetězený DAD.

Příjem XML dat pro import

Uživatel odešle formulář s daty, která se mají naimportovat do tabulek databáze. Použije se XMLAPI funkce wb_import_from_XML a vhodně navržený analytický importní DAD.

  ...
  $xml_data = $GLOBALS["HTTP_RAW_POST_DATA"];  // PHP globální proměnná obsahující XML data
  if (( @wb_import_from_XML($connection,'*prodejce_vstup',$xml_data)) !== FALSE){
    print 'Export OK';
  } else {
    print 'Export failed!';
  };

Odeslání XML dat

Skript na základě nějakých proměnných (např. _id_prodejce a _datum) sestaví dotaz, ten se použije jako zdroj dat pro exportní DAD a data se vrátí.

  ...
  $sqlstmt = 'SELECT * FROM Prodejci, Prodej WHERE Prodejci.id_prodejce=Prodej.id_prodejce AND  id_prodejce='.strval($hostvars["_id_prodejce"]["value"]).' AND prodej.datum='.strval(date("d.m.Y",$hostvars["_datum"]["value"])) ;
  $res = wb_exec($connection,$sqlstmt);
  if ($res)  // v $res je číslo kurzoru
  {
    print(wb_export_to_XML_buffer($connection,'*dadexport_prod',$res));       // poslat XML výstup funkce do Filleru
    close($res);                                                              // zavřít kurzor
  }
  else  {
    echo 'Chyba pri otevirani dotazu...';
  }

Totéž, ale dotaz se nesestaví v PHP jako řetězec ale použijí se PSQL funkce.

  ...
  $psqlstmt = 'SELECT * FROM Prodejci, Prodej WHERE Prodejci.id_prodejce=Prodej.id_prodejce AND id_prodejce=? AND prodej.datum=?' ;
  $psql=wb_psql_prepare($connection,$psqlstmt);
  wb_psql_send_param($psql, 0 /*první parametr*/, $hostvars["_id_prodejce"]["value"] /*hodnota parametru*/);
  wb_psql_send_param($psql, 1 /*druhý parametr*/, $hostvars["_datum"]["value"] /*hodnota parametru*/);
  $res = wb_psql_execute($psql);
  if ($res)  // v $res je číslo kurzoru
  {
    print(wb_export_to_XML_buffer($connection,'*dadexport_prod',$res));       // poslat XML výstup funkce do Filleru
    close($res);                                                              // zavřít kurzor
  }
  else  {
    echo 'Chyba pri otevirani dotazu...';
  }
  

Odeslání XML dat s novým formulářem (1. způsob)

Příkladem může být podání žádosti - po vyplnění se žádost odešle a do Filleru se vrátí formulář obsahující informaci o uložení a číslo, pod jakým je žádost evidována. Při vložení žádosti se pomocí sekvence přidělí unikátní číslo, které si skript přečte a použije pro získání tohoto záznamu pro odpověď. Tímto záznamem naplní formulář (bez porušení digitálního podpisu formuláře - funkce wb_get_XML_form) a vrátí jej. Formulář je uložen jako objekt v aplikaci.

  $xml_data = $GLOBALS["HTTP_RAW_POST_DATA"];

  if (( @wb_import_from_XML_buffer($connection,'*zadost_vstup',$xml_data)) !== FALSE){
    $seq_cur = -1; // bude obsahovat unikátní číslo přidělené sekvencí
    if (( wb_exec($connection, 'SET :>seq_cur = zadosti_seq.currval')) !== FALSE) {
      $sql1 = 'SELECT jmeno||" "||prijmeni AS jmeno,rc,datum,stav,cis_jed FROM Zadosti_tab WHERE id='.strval($seq_cur);
      $curs = wb_exec($connection,$sql1);

      if (( $new_xml_data = @wb_export_to_xml_buffer($connection, '*zadost_vystup', $curs, NULL)) !== FALSE ) {

        if (( $xmlform = @wb_get_xml_form($connection, '*zadost_odpoved', $new_xml_data)) !== FALSE) {
           print $xmlform;  // poslat do Filleru
        }
         else Send_error_form(5) ;
      }
      else Send_error_form(4) ;
    }
    else Send_error_form(3) ;
  }
  else Send_error_form(2) ;

  function Send_error_form($err_num){
  //poslat form Chybovy_form (obsahující jen 2 proměnné) do Filleru
   global $connection;
   if (( $err_xml_data = @wb_export_to_xml_buffer($connection, '*err_dad', NULL, array(
        "err_num" =>  array("type" => ATT_INT32,"out" => FALSE,"value" => $err_num),
        "err_date" => array("type" => ATT_DATE ,"out" => FALSE,"value" => time() )    )
      )) !== FALSE ) {
        if (( $xmlform = wb_get_xml_form($connection,'*Chybovy_form',$err_xml_data)) !== FALSE) {
          print $xmlform;
          exit;
        };
      }
  };

Odeslání XML dat s novým formulářem (2. způsob)

Jako předešlý odstavec, ale formulář je uložen jako hodnota sloupce typu CLOB v tabulce (nikoliv tedy jako objekt typu XML Formulář) - např. když databáze slouží jako sklad formulářů. Skript dostane unikátní číslo indexu, aby šlo najít vhodný záznam s CLOBem, otevře kurzor a přečte celý obsah CLOBu a ten vrátí do výstupního proudu. Je třeba nastavit HTTP hlavičku, aby browsery poznaly, že mají vyvolat dialog pro otevření 602XML Filleru.

  $id_z = $GLOBALS["id"];
  $cursor = wb_exec($connection, "SELECT XML_source, CHAR_LENGTH(XML_source) AS clob_length FROM D_root WHERE id_zadanky=".strval($id_z));

  wb_fetch_row($cursor);               // načíst první (zde jediný) záznam kurzoru
  $clob_length=wb_result($cursor,2);   // zjistit délku CLOBu
  wb_longreadlen($cursor, $clob_length);// nastavit délku čtecího bloku 
  $xml_source_clob = wb_result($cursor,1);     // přečíst CLOB
  wb_binmode($cursor, WB_PASSTHRU);    // nastavit vhodný režim práce s CLOBy

  // nastavit HTTP hlavičku požadavku ()
  header("Content-type: text/xml charset=UTF-8;");
  header("Cache-control: private");
  header("Content-Disposition: attachment; filename=zadanka.fo");

  print $xml_source_clob;   // poslat XML text s formulářem na std. výstup skriptu

  wb_close($cursor);  // zavřít otevřený kurzor (nepovinné, ale slušné)

Odeslání XML dat s novým formulářem (2. způsob) včetně modifikace dat

Předešlý příklad lze upravit tak, aby formulář se odesílal do Filleru s jinými daty. K tomu slouží druhá podoba funkce wb_get_XML_form, kde je možné předat odkaz na formulář nejen jako jméno objektu, ale i přímo jako zdrojový XML text. Jedná se tedy o kombinaci dvou posledních příkladů:

 ...
  // přečíst CLOB
  $xml_source_clob = wb_result($cursor,1);     
  ...
  $new_xml_data = wb_export_to_xml_buffer($connection, '*zadost_vystup', $curs, NULL);
  // přečíst XML formulář s daty
  $xmlform = wb_get_xml_form($connection, $xml_source_clob, $new_xml_data);
  // poslat XML text s formulářem na std. výstup skriptu
  print $xml_source_clob;   
  ...

Odeslání komprimovaného formuláře (*.ZFO) uloženého v tabulce

Zkomprimovaný formulář je uložen jako hodnota sloupce typu BLOB v tabulce (jsou to binární data, ne text).

  ...
  $sid = ...;
  $sql = 'SELECT zfo FROM Access WHERE id=?';
  $psql = wb_psql_prepare($connection, $sql);
  $res = wb_psql_execute($psql, $sid);
  wb_fetch_row($res, 1);           // načíst první řádek odpovědi
  
  $zfo_name = "pokus.zfo"  ;
  wb_binmode($res2, WB_PASSTHRU);  // nastavit režim práce s LOB
  header("Content-type: application/xml "); // pro browsery není podstatné
  header("Cache-control: private");
  header("Content-Disposition: attachment; filename=$zfo_name");

  wb_result($res, 'zfo'); // výstup binárních dat na std. výstup skriptu

Tento postup samozřejmě funguje i pro odeslání FO.

Odeslání holého textu s výsledkem (1. způsob)

V mnoha případech stačí, když uživatel po odeslání požadavku obdrží textovou informaci o výsledku, obvykle importu dat do tabulek databáze. V nejjednodušším případě, kdy se provádí pouze jediný import jedním DADem a požadavek je zadán pomocí 602SQL WebXML rozhraní (.../Schema/DAD/JménoDADu...), lze text vrácený při úspěchu a text vrácený při neúspěchu zadat přímo do definice DADu. Není třeba řešit kódování, funguje i diakritika. Texty jsou pevné a nelze je žádným způsobem modifikovat.

Odeslání holého textu s výsledkem (2. způsob)

Provádí-li složitější akce PHP skript, i ten může vracet textový výsledek akce. Velkou výhodou je, že text je možné vytvářet či modifikovat za běhu skriptu a tím reagovat na určité stavy v datech či databázi.

Výstupní text musí být v kódování UTF-8 a musí být obalen minimálně tagy <HTML> a <BODY> a musí být HTML validní.

  ...
  echo '<html><body>
         <font style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 10pt;">';

  include './db.php';
  $raw_data = $GLOBALS["HTTP_RAW_POST_DATA"];		

  if($raw_data==""){
   echo 'Odesílání dat selhalo.';			//text musí být v UTF-8, je-li tam diakritika!!
   echo '  </font>
          </body></html>';
   exit;
  }
  ...
  if($vysledek == 1) {
    echo '<b>Zpráva o prodeji byla úspěšně uložena v databázi.</b><br><br>
          Byla to první zpráva od <b>nového</b> prodejce.';
   } elseif( $vysledek == 2) {
    echo '<b>Zpráva o prodeji byla úspěšně uložena v databázi.</b><br><br>
          Byla to další zpráva od prodejce již uloženého v databázi.';
  ...};
  echo '  </font>
         </body></html>';