Convertir PMYSQL_ROW en string [Résolu]

floppy41 25 Messages postés vendredi 27 juin 2008Date d'inscription 6 novembre 2009 Dernière intervention - 20 avril 2009 à 16:22 - Dernière réponse : floppy41 25 Messages postés vendredi 27 juin 2008Date d'inscription 6 novembre 2009 Dernière intervention
- 20 avril 2009 à 21:19
Bonjour a tous,
dans le cadre d'un exécutable de suivis de production en entreprise, je récupère des données et les enregistres dans une base MySQL, puis les affiche dans un Stringgrid.
Je procède de la manière suivante :
var
req_tps_prod: array [0..12] of string;
tps_prod: array [0..12] of PMYSQL_ROW;
for i:=1 to 12 do begin
//Requete SQL
req_tps_prod[i]:='SELECT ((SUM(tps_prod_alarme))-1)*10 FROM '+table+ ' WHERE le_mois = '+les_i[i]+'';

// traitement des requetes
mysql_query(mysql, pchar(req_tps_prod[i]));
tps_prod[i]:=mysql_fetch_row(mysql_store_result(mysql));

//affichage
With Stringgrid1 do begin
if (tps_prod[i]=nil) then else Cells[i,1]:=TimeToStr(strtoint(tps_prod[i])))/24/3600);
end;
end;

le probleme se situe au niveau de la derniere ligne : Types incompatibles: 'String' et 'PMYSQL_ROW'

Si quelqu'un a une idée...
Merci d'avance.
Afficher la suite 

6 réponses

Répondre au sujet
Aurel184 22 Messages postés dimanche 14 mars 2004Date d'inscription 9 juin 2010 Dernière intervention - 20 avril 2009 à 21:06
+3
Utile
oui normal, autant pour moi :)

la fonction mysql_fetch_row renvoi un tableau qui contient toutes les colonnes retournées par la requête. Et même s'il n'y a qu'une seule colonne, c'est quand même un tableau. Comme tu utilises déjà un tableau de PMYSQL_ROW, il va falloir utiliser un tableau à deux dimension :

var
req_tps_prod: array [0..12] of string;
tps_prod: array [0..12] of PMYSQL_ROW;
tps_prod_ansiString : array [0..12] or AnsiString;
for i:=1 to 12 do
begin
req_tps_prod[i]:='SELECT ...';
mysql_query(mysql, pchar(req_tps_prod[i]));
tps_prod[i]:=mysql_fetch_row(mysql_store_result(mysql));
tps_prod_ansiString[i] := tps_prod[i]^[0];
With Stringgrid1 do
begin
if (tps_prod[i]=nil) then else
Cells[i,1]:=TimeToStr(strtoint(tps_prod_ansiString[i])))/24/3600);
end;
end;
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Aurel184
Aurel184 22 Messages postés dimanche 14 mars 2004Date d'inscription 9 juin 2010 Dernière intervention - 20 avril 2009 à 16:44
0
Utile
bonjour, ton problème vient du fait que le type PMYSQL_ROW est un pointeur vers un tableau de caractère, soit un pointeur de pointeur. Il faut donc utiliser le caractère "^" pour l'affecter à une chaîne de caractère.

De plus il faudra d'abord les stocker dans une AnsiString (chaîne de caractère C) avant de le convertir en string Delphi (problème de format).

en gros voici à quoi devrait ressembler ton code :

var
req_tps_prod: array [0..12] of string;
tps_prod: array [0..12] of PMYSQL_ROW;
tps_prod_ansiString : array [0..12] or AnsiString;
for i:=1 to 12 do
begin
req_tps_prod[i]:='SELECT ...';
mysql_query(mysql, pchar(req_tps_prod[i]));
tps_prod[i]:=mysql_fetch_row(mysql_store_result(mysql));
tps_prod_ansiString[i] := tps_prod^[i];
With Stringgrid1 do
begin
if (tps_prod[i]=nil) then else
Cells[i,1]:=TimeToStr(strtoint(tps_prod_ansiString[i])))/24/3600);
end;
end;
Commenter la réponse de Aurel184
floppy41 25 Messages postés vendredi 27 juin 2008Date d'inscription 6 novembre 2009 Dernière intervention - 20 avril 2009 à 19:07
0
Utile
Merci, mais maintenant il me dit "Type pointer requis", une idée?
Commenter la réponse de floppy41
Aurel184 22 Messages postés dimanche 14 mars 2004Date d'inscription 9 juin 2010 Dernière intervention - 20 avril 2009 à 20:06
0
Utile
il te dis ça pour quelle ligne ?
Commenter la réponse de Aurel184
floppy41 25 Messages postés vendredi 27 juin 2008Date d'inscription 6 novembre 2009 Dernière intervention - 20 avril 2009 à 20:43
0
Utile
Pour celle-ci :
tps_prod_ansiString[i] := tps_prod^[i];
Commenter la réponse de floppy41
floppy41 25 Messages postés vendredi 27 juin 2008Date d'inscription 6 novembre 2009 Dernière intervention - 20 avril 2009 à 21:19
0
Utile
Impecable merci beaucoup, voila la ligne qui fontionne (fallait aussi enlever quelques parenthèses, et j'ai décider de supprimer les tableaux en de type AinsiString, ça fait toujours moins de mémoire d'utilisée)
if (tps_prod[i]^[0]=nil) then else Cells[i,1]:=TimeToStr(strtoint(tps_prod[i]^[0])/24/3600);
Voila.
Encore une fois Merci.
A bientot.
Commenter la réponse de floppy41

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.