Convertir PMYSQL_ROW en string

Résolu
floppy41 Messages postés 25 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 6 novembre 2009 - 20 avril 2009 à 16:22
floppy41 Messages postés 25 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 6 novembre 2009 - 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.

6 réponses

Aurel184 Messages postés 21 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 9 juin 2010 1
20 avril 2009 à 21:06
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;
3
Aurel184 Messages postés 21 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 9 juin 2010 1
20 avril 2009 à 16:44
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;
0
floppy41 Messages postés 25 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 6 novembre 2009
20 avril 2009 à 19:07
Merci, mais maintenant il me dit "Type pointer requis", une idée?
0
Aurel184 Messages postés 21 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 9 juin 2010 1
20 avril 2009 à 20:06
il te dis ça pour quelle ligne ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
floppy41 Messages postés 25 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 6 novembre 2009
20 avril 2009 à 20:43
Pour celle-ci :
tps_prod_ansiString[i] := tps_prod^[i];
0
floppy41 Messages postés 25 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 6 novembre 2009
20 avril 2009 à 21:19
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.
0
Rejoignez-nous