|
PROFESSIONAL NEWSGROUPS WINDEV, WEBDEV and WINDEV Mobile |
| | | | | |
Webservice insertion de plusieurs enregistrements |
Started by Monsieur RÉDA, Jul., 19 2017 9:42 PM - 15 replies |
| |
| | | |
|
| |
Registered member 217 messages Popularité : +12 (12 votes) |
|
Posted on July, 19 2017 - 9:42 PM |
Bonjour, j'utilise un webservice qui manipule une base hfsql cs via une collection de procédures
Dans la collection de procédures du webservice, je voudrais ajouter une procédure qui permet d'ajouter plusieurs lignes dans une fichier.
Supposons que le fichier en question contient deux rubriques : A1 et A2. Au niveau de la déclaration de la collection, j'ai donc crée un structure de contenant les deux attributs A1 et A2 :
STLignTest est une structure A1 est une chaîne; A2 est un réel; FIN La procédure prends en paramètre un tableau de cette structure :
Procedure AjouteMultipleV1(T1 est un tableau de STLignTest)
P est une STLignTest; nb est un entier; nb = 0; POUR TOUT P de T1 HRAZ(Test); Test.A1=P:A1; Test.A2=P:A2; HAjoute(Test) nb++; FIN RENVOYER nb;
Ensuite au niveau de la consommation, je rempli un tableau de STLignTest et je le fais passer en paramètre lors de l'appel de la procédure :
L est un STLignTest; T est un tableau de STLignTest;
i est un entier; POUR i=1 A 6 L.A1 = "Texte "+i; L.A2=i; TableauAjoute(T,L); FIN
r est un entier;
r = AjouteMultipleV1(T);
Au niveau du simulateur, tout se passe à merveille, les 6 enregistrements sont ajoutée à la base distante, cependant sous android, aucune insertion ne se fait ? Je précise que pour une simple insertion, je ne rencontre pas de problème sur andoid, le problème apparait uniquement lorsque je passe un tableau de structure en paramètre.
J'ai aussi essayer d'encapsuler le tableau dans une structure au lieu de faire passer le tableau je passe la variable structure... le résultat est identique : ça marche en simulateur mais pas après déploiement sur le device!! Auriez vous une idée sur ce problème??Message modified, July, 19 2017 - 9:58 PM |
| |
| |
| | | |
|
| | |
| |
Registered member 1,298 messages Popularité : +20 (72 votes) |
|
Posted on July, 19 2017 - 9:59 PM |
Plutot que d'utiliser un tableau comme parametre
STLignTest est une structure A1 est une chaîne A2 est un réel FIN
ST_tab_LignTest est une structure nOccurence est un entier MON_TABLignTest est un tableau de STLignTest FIN
Procedure AjouteMultipleV1(T1 est ST_tab_LignTest )
...
Je ne sais pas avec les nouvelles version mais avant sans le "nOccurence est un entier" cela ne fonctionnait pas
-- Bertin CARRIERE Consultant & Formateur bertin.carriere@gmail.com http://www.zen-project.be http://www.linkedin.com/in/bertincarriere Belgique +32(0)2/318.02.67 France +33(0)3/66.722.542 Espagne +34.5/12.702.266
Membre de http://www.be-dev.be |
| |
| |
| | | |
|
| | |
| |
Registered member 217 messages Popularité : +12 (12 votes) |
|
Posted on July, 19 2017 - 10:51 PM |
je vous remercie de votre aide.
J'ai tenté des mettre en oeuvre votre idée et j'obtient toujours le même résultat (OK en simulateur, pas ok sous le device) je me suis peut être mal pris : Au niveau de la déclaration de la collection :
STLignTest est une structure A1 est une chaîne; A2 est un réel; FIN
ST_tab_LignTest est une structure nOccurence est un entier MON_TABLignTest est un tableau de STLignTest FIN
Dans la définition de la procédure d'insertion, je met le tableau de la structure dans une variable locale à la procédure :
Procedure AjouteMultipleV2(T est un ST_tab_LignTest)
T1 est un tableau de STLignTest; T1 = T:MON_TABLignTest
P est une STLignTest; nb est un entier; nb = 0; POUR TOUT P de T1 HRAZ(Test); Test.Designation=P:A1; Test.delai=P:A2; HAjoute(Test) nb++; FIN
RENVOYER nb;
et la consommation du webservice (appel de la procédure) :
L est une ST_tab_LignTest;
P est un STLignTest; T est un tableau de STLignTest; i est un entier; POUR i=1 A 6 P.A2=i; TableauAjoute(T,P); FIN
n est un entier; n = T..Occurrence;
L.MON_TABLignTest=T; L.nOccurence=n;
r est un entier; r = AjouteMultipleV2(L); Info(r); je n'ai pas très bien compris l'interet de l'attribut nOccurence, je l'ai rempli lors de l'appel.
me suis-je mal pris quelque part ? |
| |
| |
| | | |
|
| | |
| |
Registered member 1,298 messages Popularité : +20 (72 votes) |
|
Posted on July, 19 2017 - 11:16 PM |
Plutot que d'utiliser un tableau comme parametre
STLignTest est une structure A1 est une chaîne A2 est un réel FIN
ST_tab_LignTest est une structure nOccurence est un entier MON_TABLignTest est un tableau de STLignTest FIN
Procedure AjouteMultipleV1(T1 est ST_tab_LignTest )
...
Je ne sais pas avec les nouvelles version mais avant sans le "nOccurence est un entier" cela ne fonctionnait pas
-- Bertin CARRIERE Consultant & Formateur bertin.carriere@gmail.com http://www.zen-project.be http://www.linkedin.com/in/bertincarriere Belgique +32(0)2/318.02.67 France +33(0)3/66.722.542 Espagne +34.5/12.702.266
Membre de http://www.be-dev.be |
| |
| |
| | | |
|
| | |
| |
Registered member 217 messages Popularité : +12 (12 votes) |
|
Posted on July, 20 2017 - 12:20 AM |
Je désespère, autant j'arrive à renvoyer un tableau de structure à partir d'une procédure, autant qu'il m'est impossible de faire passer un tableau de structure en entrée! je pense avoir tout essayer : Tableau de structure, Structure encapsulant un tableau de structure, sérialisation, déserialisation,... rien à faire... Au lieu de faire une procédure qui insere plusieurs enregistrements, je devrais peut être faire une procédure qui insere qu'un seul enregistrement et je fais appel à cette procédure plusieurs fois |
| |
| |
| | | |
|
| | |
| |
Registered member 1,298 messages Popularité : +20 (72 votes) |
|
Posted on July, 20 2017 - 10:45 AM |
ST_tab_LignTest est une structure nOccurence est un entier MON_TABLignTest est un tableau de STLignTest FIN
il faut utiliser une structure, qui elle même contient un tableau de structure.
MAIS SURTOUT avoir dans cette 1° structure une variable de type classique par exemple un entier. Dans ce cas alors cela fonctionne
-- Bertin CARRIERE Consultant & Formateur bertin.carriere@gmail.com http://www.zen-project.be http://www.linkedin.com/in/bertincarriere Belgique +32(0)2/318.02.67 France +33(0)3/66.722.542 Espagne +34.5/12.702.266
Membre de http://www.be-dev.be |
| |
| |
| | | |
|
| | |
| |
Registered member 217 messages Popularité : +12 (12 votes) |
|
Posted on July, 20 2017 - 11:00 AM |
Bonjour et merci de me répondre c'est ce que j'ai fais, dans mon post #3 et ça ne marche pas. me suis-je mal pris quelque part ? |
| |
| |
| | | |
|
| | |
| |
Registered member 1,298 messages Popularité : +20 (72 votes) |
|
Posted on July, 20 2017 - 12:12 PM |
| |
| |
| | | |
|
| | |
| |
Registered member 217 messages Popularité : +12 (12 votes) |
|
Posted on July, 20 2017 - 12:51 PM |
oui bien sur. Je recapitule : Je dispose d'une fichier Test avec deux rubriques, disons A1 et A2.
Dans le webservice, je souhaite faire une procédure (AjouteMultiple) qui ajoute plusieurs lignes dans ce fichier Test. Donc au lieu de faire passer un tableau de structure en paramètre, je fais passer une structure qui contient elle même un membre de type de type tableau de structure. En niveau de la déclaration globale de la collection de procédure du webservice, j'ai donc ajouté ces déclarations :
STLignTest est une structure A1 est une chaîne; A2 est un réel; FIN
ST_tab_LignTest est une structure nOccurence est un entier MON_TABLignTest est un tableau de STLignTest FIN
Voici le code de la procédure du webservice qui fait l'insertion et en prenant en entrée un variable de type ST_tab_LignTest :
Procedure AjouteMultipleV2(T est un ST_tab_LignTest)
T1 est un tableau de STLignTest; T1 = T:MON_TABLignTest
P est une STLignTest; nb est un entier; nb = 0; POUR TOUT P de T1 HRAZ(Test); Test.A1=P:A1; Test.A2=P:A2; HAjoute(Test) nb++; FIN
RENVOYER nb;
Ensuite au niveau de la consommation : (sur device android) :
L est une ST_tab_LignTest;
P est un STLignTest;
T est un tableau de STLignTest; i est un entier;
POUR i=1 A 6 P.A2=i; TableauAjoute(T,P); FIN
n est un entier; n = T..Occurrence;
L.MON_TABLignTest=T;
L.nOccurence=n;
r est un entier;
r = AjouteMultipleV2(L);
Info(r);
En exécution sur simulateur, l'insertion des 6 ligne se fait sans problème mais sur le device android, aucune insertion n'est faite et de plus la procédure renvoie toujours 0 au lieu de 6.
edit, je précise qu'il ne s'agit pas d'un problème de connexion à la base car elle est distante et je m'y connecte sans problème que ça soit sur android ou sur simulateur pcMessage modified, July, 20 2017 - 12:54 PM |
| |
| |
| | | |
|
| | |
| |
Registered member 1,298 messages Popularité : +20 (72 votes) |
|
Posted on July, 20 2017 - 2:23 PM |
| |
| |
| | | |
|
| | |
| |
Registered member 217 messages Popularité : +12 (12 votes) |
|
Posted on July, 20 2017 - 3:21 PM |
Merci quand même Peut etre quil nest tout simplement pas possible de faire passer une structure avec tableau en parametre à une procedure de ws appelé depuis android? Avec une simple variable ca passe Avec une variable de type structure avec des membres de type simple ca passe aussi Avec un tabelau de type simple entier par exemple, ca passe Avev un tableau de structure ca passe pas Avec une structure englobant un tableau de structure (votre conseil) ca ne passe pas non plus.
Pour contourner ce probleme. Jai pensé à faire passer une chaine qui engloble toutes les valeurs que je veux inserer en y integrant deux separateur distincts : un pour séparer les différentes valeurs du même enregistrement et l'autre pour separer entre les enregistements
Et dans la procedure je split toute la chaine... cest moins pratique quavec une structure mais je vois pas un autre moyen...sauf si je fais l'appel plusueurs fois en passant une structure ...mais là y aura plusieurs aller-retour |
| |
| |
| | | |
|
| | |
| |
Registered member 1,298 messages Popularité : +20 (72 votes) |
|
Posted on July, 20 2017 - 4:02 PM |
| |
| |
| | | |
|
| | |
| |
Registered member 217 messages Popularité : +12 (12 votes) |
|
Posted on July, 20 2017 - 4:20 PM |
Jai deja fait ça sans résultat. Je serialise dans un buffer et jenvoie le buffer A la reception je deserialise le buffer dans un tableau. Ca marche pas.
Par contre votre a attiré mon attention : "envoyer le.buffer dans une chaine" ? Lors de mes test jai fais passé le buffer (apres serialisation) non pas une chaine. Voulez vous dire de mettre le buffer serialisé dans une chaine et faire passer la chaine ? Ça, je nai pas essayé.. |
| |
| |
| | | |
|
| | |
| |
Registered member 217 messages Popularité : +12 (12 votes) |
|
Posted on July, 20 2017 - 6:15 PM |
je viens de tester en mettant le buffer dans une chaine, ça ne marche pas |
| |
| |
| | | |
|
| | |
| |
Registered member 1,623 messages Popularité : +100 (114 votes) |
|
Posted on July, 21 2017 - 4:36 PM |
Vous devriez tester coté web-service. Ajouter des logs afin de voir ce que le web-service reçoit effectivement. |
| |
| |
| | | |
|
| | |
| |
Registered member 217 messages Popularité : +12 (12 votes) |
|
Posted on July, 21 2017 - 5:42 PM |
François C. a écrit :
Vous devriez tester coté web-service. Ajouter des logs afin de voir ce que le web-service reçoit effectivement. Merci François de me répondre! j'ai un peu avancé mais ce n'est toujours pas en point! En fait, au niveau de la déclaration de la structure, le tableau de structure est déclarée en tableau DYNAMIQUE, ainsi j'arrive à faire passer quelques choses... mais ce n'est pas exactement ce que j'attentais :
ST_tab_LignTest est une structure nOccurence est un entier MON_TABLignTest est un tableau dynamiquedynamique de STLignTest FIN je n'ai pas touché à la structure :
STLignTest est une structure A1 est une chaîne; A2 est un réel; FIN En faisant quelques tests, j'ai constaté que c’était au niveau de l'appel de la procédure que ça cloche et non pas dans le code de la procédure du webservice. Voici ci-dessous un test d'appel. Dans ce test, je déclare une ST_tabl_LignTest, et je remplis son tableau de manière manuelle par 4 valeurs (structure) Ensuite avant d'appeler la procédure du webservice, j'affiche le contenu du tableau pour voir ce qui en est :
P est un STLignTest; Tabl est un ST_tab_LignTest;
P.A1=1; P.A2=11 TableauAjoute(Tabl.MON_TABLignTest,P);
P.A1=2; P.A2=22; TableauAjoute(Tabl.MON_TABLignTest,P);
P.A1=3; P.A2=33; TableauAjoute(Tabl.MON_TABLignTest,P);
P.A1=4; P.A2=44; TableauAjoute(Tabl.MON_TABLignTest,P);
r est un entier;
POUR i=1 A 4 Info(Tabl.MON_TABLignTest[i].A1); FIN
r = AjouteMultipleV2(Tabl); Info(r); Normalement, les valeurs qui doivent être affichées avant l'appel sont : (selon l'exemple que j'ai mis en dur) 1 2 3 4
En simulation, ce sont les bonnes valeurs qui s'affichent, mais en exécution sur device c'est autre chose : (vide) 4 4 4
C'est vraiment très frustrant de voir que cela marche bien en simulation mais pas sous android!Message modified, July, 21 2017 - 5:47 PM |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|