PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV Mobile 2024 → Webservice insertion de plusieurs enregistrements
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;



//Remplissage du tableau avec 6 valeurs (structures)
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
Pouvez vous mettre votre dernier code

--
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: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 :
// Déclaration d'une structure (STLignTest) représentant les rubriques du fichier Test
STLignTest est une structure
A1 est une chaîne;
A2 est un réel;
FIN
// Declaration d'une structure englobant un tableau de la structure précédant (en plus du membre nOccurence de type entier)
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)

// Je déclare en locale T1 : un tableau de la structure qui va devoir prendre le membre Tableau de la variable T1 passée en paramètre :
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
// je renvoie le nombre d'itération de la boucle pour vérifier si la variable est bien passée en paramètre.
RENVOYER nb;


Ensuite au niveau de la consommation : (sur device android) :
// je déclare le paramètre à faire passer
L est une ST_tab_LignTest;


P est un STLignTest;
//je déclare le membre Tableau de la variable L
T est un tableau de STLignTest;
i est un entier;

// je remplis le tableau par 6 valeurs
POUR i=1 A 6
P.A2=i;
TableauAjoute(T,P);
FIN
// ICI s'i j'affiche le nombre d'occurence de T, j'obtiens bien 6 au nievau de l'execution sur android

n est un entier;
n = T..Occurrence;

//J'affecte le tableau T au membre Mon_TabLignTest de la variable L
L.MON_TABLignTest=T;
//je fais de même pour nOccurence
L.nOccurence=n;


r est un entier;
// je fais appel à la procédure du webservice
r = AjouteMultipleV2(L);
// j'affiche r
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 pc
Message modified, July, 20 2017 - 12:54 PM
Registered member
1,298 messages
Popularité : +20 (72 votes)
Posted on July, 20 2017 - 2:23 PM
La je ne vois pas comme cela le pourquoi

--
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 - 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
Serialise le tableau vers un buffer

envoye le buffer dans une chaine


apres réception

Désérialisé le buffer vers le tableau

--
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 - 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