DATAPAGESIZE et odbc_exec()

sdisp Messages postés 75 Date d'inscription jeudi 27 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 - 11 déc. 2006 à 17:11
sdisp Messages postés 75 Date d'inscription jeudi 27 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 - 13 déc. 2006 à 17:09
Bonjour.

   J'ai une page php qui se connecte à un AS400, qui exécute une requête et qui affiche dans un tableau son résultat.

   Le souci que j'ai c'est qu’il peut y avoir beaucoup de ligne et j'aurai donc voulu afficher le résultat sur plusieurs pages.

   Je suis tout d'abord parti sur une requête avec une clause limit (select * from nom_table limit 0,10) et j'aurai donc ré exécuter ma requête à chaque changement de pages en changeant cette valeur dans ma requête (limit 0,10 pour la première page, limit 10,20 pour la deuxième...).
Mais cette instruction ne marche apparemment pas sur l'as400 (BDD de type DB2).

   Apres une petit recherche j'ai trouvé l'attribut DATAPAGESIZE (http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/datapagesize.asp) que l'on peux ajouter à la balise <table> et qui permettrait de limiter le nombre de ligne que l'on affiche dans une table. Puis pour parcourir les autres pages il faudrait faire un nextPage.

   Mais il faut définir une DATASRC (http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/datapagesize.asp) pour utiliser DATAPAGESIZE.

Je voudrai donc savoir si je peux définir cette DATASRC à partir du résultat de mon odbc_exec() et comment celà se ferait-il?

Une autre solution serai de mettre le résultat dans un tableau de session et de me débrouiller avec ce tableau pour afficher ce que je souhaite, mais je ne suis pas sur que ce soit une solution idéale?

D'autre solution?

Merci d'être arrivé au bout de ma question, j'espère avoir été compris.

Bonne journée.

3 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
12 déc. 2006 à 10:12
Hello,

tu trouveras ici :
http://www.phpcs.com/codes/PHP5-LIMIT-PACKAGE-LIMITATION-GENERIQUE-JEU-RESULTAT-ITERATEURS_40545.aspx
Une classe permettant de limiter un jeu de données.
Il n'y a pas de version odbc, mais il te suffit de prendre la classe mysqllimit ou mssqllimit, et de la réécrire en remplaçant simplement les mssql_num_rows(), mssql_fetch_assoc(), mssql_fetch_field avec les équivalents odbc.
0
sdisp Messages postés 75 Date d'inscription jeudi 27 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 1
12 déc. 2006 à 16:20
Bonjour.

Merci malalam celà me semble très bien je me penche dessus.

@+
0
sdisp Messages postés 75 Date d'inscription jeudi 27 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 1
13 déc. 2006 à 17:09
Bonjour.

   Pour le moment je n'ai pas encore bien cerner comment fonctionne ce que tu m'as proposé Malalam (je n'ai pas eu beaucoup de temps pour l'étudier et suis certainement encore un peu trop novice). Mais je voudrais déjà te demander si la solution que tu me propose diminue le temps d'exécution de la requête? Ou si la requête est quand même exécuté sur tous les éléments?

   Pour le moment j'ai eu l'occasion de faire quelque chose avec le DATAPAGESIZE mais je me sers d'un fichier texte comme DATASRC dans lequel j'écris le résultat de ma requête, ce qui ne me semble pas être la meilleure solution surtout quand on a affaire à une requête qui retourne un grand nombre de ligne (perte de temps pendant l'écriture).

   Donc je reviens sur ma demande initiale qui était, puis-je faire une DATASRC à partir du résultat du odbc_exec() ou alors d'un tableau php?

Voici mon code:


<html>
   
       
            Test AS400

       

        <?php
       
                // connexion à l'AS/400
                $link = odbc_connect("DRIVER=iSeries Access ODBC Driver;SYSTEM=X.X.X.X;", "xxx", "xxx");   //nom du driver;@ip_as400;login;mot_de_passe
                // requete à executé:
                $query = "SELECT * FROM nom_bilblioteque.nom_fichier";
                // execution de la requete
                $result = odbc_exec($link, $query);
               
                $tab_nom_col = array();     //varibale de type tableau pour sauvegarder le nom des colonnes
                $str_result="";     //variable de type chaine qui va permettre de creer le fichier avec le resultat de la requete


                if ($result == false){     //test si la requete a ete execute(ne marche pas!!!)
                    echo (" Error " . odbc_error() . ": " . odbc_errormsg() . " ");
                }else{      //parcours du resultat
                    for ($i = 0; $i < odbc_num_fields($result); $i++) {     //parcours du nom des colonnes
                        $tab_nom_col[$i]= odbc_field_name($result,$i+1);     //on sauvegarde le nom de chaque colonnes dans un element du tableau tab_nom_col
                        $str_result.='"'.odbc_field_name($result,$i+1).'"';      //on sauvegarde le nom de chaque colonnes dans la chaine str_result
                        if($i!=odbc_num_fields($result)-1){     //si on est pas a la derniere colonne
                            $str_result.=';';       //on met un point virgule pour separer leurs noms
                        }
                    }
                    while(odbc_fetch_into($result , $prod) != FALSE) {       //parcours de chaque lignes
                        $str_result.="\r\n";        //on reviens a la ligne a la fin de chaques lignes
                        for ($j = 0; $j < odbc_num_fields($result); $j++) {       //parcours de chaque colonnes d'une lignes
                            $str_result.='"'.$prod[$j].'"';     //on sauvegarde chaques valeurs de chaques colonnes d'une lignes dans str_result
                            if($j!=odbc_num_fields($result)-1){     //si on est pas a la fin de la ligne
                                $str_result.=';';       //on met un point virgule pour separer leurs valeurs
                            }
                        }
                    }
                }
                //fermeture de la connec
                odbc_close($link);


                $path="./";     //chemin dans lequel le fichier sera cree
                $fp=fopen($path."connec_as400.txt","w");       //creation du fichier en ecriture, ecrasement s'il existe extension en .csv
                $ecrit=fputs($fp,$str_result);      //on ecrit le contenu de str_result dans le fichier
                fclose($fp);        //fermeture du fichier
           
        ?>
   
        <SCRIPT FOR=tdcElements EVENT=ondatasetchanged>     //permet de recuperer le nb d'elements
        // wait until the DSO announces the datasetchanged event before accessing the ADO recordset
        document.body.all('spanElemCount').innerText = tdcElements.recordset.recordCount;
    </SCRIPT>


        <OBJECT id=tdcElements CLASSID="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83">        <!--permet de definir le fichier comme source du tableau que l'on va afficher-->
           
           
           
           
        </OBJECT>
        nb elem :        <!--affichage du nb d'elements-->
       

        <<        <!--bouton 1er elem-->
        &lt;       <!--bouton elem precedent-->
        &gt;       <!--bouton elem suivant-->
        >>     <!--bouton dernier elem-->
       

        nb elem a afficher :         <!--champ pour choisir le nb d'elem a afficher mis a jour quand le champ perd le focus-->
       

                <!--table dans laquelle on va afficher le contenu de notre object (le fichier)-->
            ----

           
            <?      //si on ne connait pas le nom des colonnes on parcours le tableau tab_nom_col
                foreach($tab_nom_col as $cle =>$valeur)
                {
                    ?>
                    <?=$valeur?>,
                    <?
                }
            ?>

           
           

            ----

            <?      //si on ne connait pas le nom des colonnes on parcours le tableau tab_nom_col
                foreach($tab_nom_col as $cle=>$valeur)
                {
                    ?>
                    >,
                    <?
                }
            ?>
           

           
       

   
</html>

Le fichier text créé resemble donc a celà:

"nom_col1";"nom_col2"";"nom_col3"";"nom_col4";
"val1-1";"val1-2";"val1-3";"val1-4";
"val2-1";"val2-2";"val2-3";"val2-4";
"val3-1";"val3-2";"val3-3";"val3-4";

Si quelqun a une idée pour améliorer tout cela?

Merci.

@+
0
Rejoignez-nous