Tient cela confirme que c'est bien ORACLE !
Est-ce MIN(0) est possible que donne le SQL sur PL/SQL ou TOAD
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 select colxcol, cdexent,0 as regrouper from ENTXRES E JOIN COLXRES C ON NUMXENT=NUMXCOL WHERE CODXENT =:cod and TOUXENT =:tou and MARXENT =:mar and (refxcol is not null) group by cdexent, colxcol
Il faudrait que tu reprennes nos différentes approches !
Tu peux les combiner
DefaultDrawing à false via l'inspecteur
un SQL bidon + 3 Columns dans le DBGrid bien liées comme il faut
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Windows XP
Delphi 7
WinDev Mobile 17
ce n'est pas ce tuto dont Juju1988 parlait au départ, je n'ai pas regardé les autes tutosSurtout que cela a été mentionné dans Comment formater l'affichage d'un champ dans un TDBGrid ?
L'histoire des variables non liées ne serait en rapport avec les paramètres de ta requête par hasard ? est-ce qu'elles sont toutes affectées via ParamByName() ou est-ce ta requête est un ensemble détail d'une autre requête ?
M E N S . A G I T A T . M O L E M
Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal
"La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."
Voici le code complet, mes paramètres sont récupérés de mon premier datagrid (voir pièce jointe au début du topic :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 x_cli := DBGrid_affich.Fields[0].AsString; x_tournee := DBGrid_affich.Fields[1].AsString; if DBGrid_affich.Fields[2].AsString = 'ROUTE' then x_transport := 'RO' else if DBGrid_affich.Fields[2].AsString = 'MARITIME' then x_transport := 'MA' else if DBGrid_affich.Fields[2].AsString = 'AERIEN' then x_transport := 'AE'; q_select.Close; q_select.SQL.Clear; q_select.SQL.Add('SELECT colxcol, cdexent,0 AS regrouper FROM ENTXRES E JOIN COLXRES C ON NUMXENT=NUMXCOL'); q_select.SQL.Add('and CODXENT =:cod'); q_select.SQL.Add('and TOUXENT =:tou'); q_select.SQL.Add('and MARXENT =:mar'); q_select.SQL.Add('and (refxcol is not null) group by cdexent, colxcol'); q_select.ParamByName('cod').AsString := x_cli; q_select.ParamByName('tou').AsString := x_tournee; q_select.ParamByName('mar').AsString := x_transport; q_select.Open;
Windows XP
Delphi 7
WinDev Mobile 17
Il manque un WHERE, il semble...
devrait être un peu mieux...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 with q_select do begin Close; SQL.Text := 'SELECT colxcol, cdexent,0 AS regrouper FROM ENTXRES E JOIN COLXRES C ON NUMXENT=NUMXCOL '#10+ 'WHERE CODXENT =:cod '#10+ 'and TOUXENT =:tou '#10+ 'and MARXENT =:mar '#10+ 'and (refxcol is not null) group by cdexent, colxcol'; ParamByName('cod').AsString := x_cli; ParamByName('tou').AsString := x_tournee; ParamByName('mar').AsString := x_transport; Open; end;
Selon tes dires, il est possible de mettre en place une relation maître/détails mais si le code marche, on ne va pas se compliquer la vie.
M E N S . A G I T A T . M O L E M
Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal
"La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."
Effectivement il manquait le where mais bon même comme ça ça ne change rien...
Windows XP
Delphi 7
WinDev Mobile 17
Tu as bien crée une colonne dans le DBGrid_select pour lire regrouper ?
Fait un test vite fait
pose un nouveau tdbgrid affecte lui un nouveau datasource et associe lui la q_select
Ne touche à rien de plus, laisse tout le reste par défaut pas besoin de faire du joli
lance ton code qui fait le q_select.Open();
est-ce que ce nouveau tdbgrid affiche bien tout y compris les zéros ?
Après, une fois les zéros OK, fait lui son propre DrawCell (n'utilise pas celui que tu as codé pour DBGrid_select sauf si tu maitrise bien le paramètre Sender et le transtypage)
A mon avis à force de jouer, tu as touché à trop de truc qui font merdé un truc qui doit fonctionner du 1er coup !
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Alors j'ai fait tout comme tu as dit :
- Nouveau dbgrid
- Nouveau datasource
- DataSource associé a q_select
==> Les 0 s'affichent.
J'ai quand même mis la même procédure dans le drawCell (juste pour voir et parce que je n'en ai jamais testé d'autres) et j'ai toujours mes 0 mais pas de case à cocher...
Windows XP
Delphi 7
WinDev Mobile 17
Bonne Nouvelle
mais ta drawCell touche DBGrid_select et non le nouveau dbgrid !
Soit tu modifie la drawCell pour gérer le Sender
Soit tu copie-colle la drawCell vers un nouveau gestionnaire dans lequel tu remplace DBGrid_select par dbgrid1
Tu associe ce nouveau gestionnaire à dbgrid1
Et j'espère que cela fonctionnera !
Pour info voici la variante avec Sender et imgCheck (0 = non coché, 1 =coché)
pour gérer la coche sur le double clic, je te laisse traduire ce code c++ delphisé à l'arrache, là je dois partir ... a demain !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 procedure TFS42.DBGrid_SelectDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin with Sender as TDBGrid do begin // On ne prend en compte que la colonne REGROUPER if sameText(Column.FieldName, 'REGROUPER') then begin { On efface la cellule } Canvas.FillRect(Rect); { Cochée ou Pas ?} dmImages.imgCheck.Draw(DBGrid_select.Canvas, Rect.Left + ((Rect.Right - Rect.Left - dmImages.imgCheck.Width) div 2), Rect.Top, Column.Field.AsInteger; // 0 = non coché, 1 coché ); end { si column ne correspond pas à une case à cocher, } { on ne s'occupe pas du dessin de la cellule, on } { transmet donc à DefaultDrawColumnCell } else begin DefaultDrawColumnCell(Rect, DataCol, Column, State); end; end; end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 //--------------------------------------------------------------------------- void __fastcall TDBManipForm::DBGridCDSBasicsDblClick(TObject *Sender) begin if (Sender.InheritsFrom(__classid(TDBGrid))) begin TPoint CursorPos = Mouse.CursorPos; TDBGrid* Grid = ((TDBGrid*)Sender); CursorPos = Grid.ScreenToClient(CursorPos); TGridCoord Coord = Grid.MouseCoord(CursorPos.x, CursorPos.y); TField *Field = Grid.Columns.Items[Coord.X].Field; if sameText(Field.FieldName, 'REGROUPER') then begin TDataSetState KeepState = Field.DataSet.State; if ((KeepState != dsEdit) && (KeepState != dsInsert)) Field.DataSet.Edit(); Field.AsBoolean = ! Field.AsBoolean; if ((KeepState != dsEdit) && (KeepState != dsInsert)) Field.DataSet.Post(); end end end
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Je reprends le code initial:
si cela ne fonctionne pas, il faut vérifier que :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 procedure TFS42.DBGrid_SelectDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin // On ne prend en compte que la colonne REGROUPER if sameText(Column.FieldName, 'REGROUPER') then begin { On efface la cellule } DBGrid_select.Canvas.FillRect(Rect); { Cochée ou Pas ?} dmImages.imgCheck.Draw(DBGrid_select.Canvas, Rect.Left + ((Rect.Right - Rect.Left - dmImages.imgCheck.Width) div 2), Rect.Top, Ord(Column.Field.AsString = '0') //au lieu de Ord(monDB.Fields[3].AsString = '0') sinon me coche toutes les cases sur la recherche ); end { si column ne correspond pas à une case à cocher, } { on ne s'occupe pas du dessin de la cellule, on } { transmet donc à DefaultDrawColumnCell } else begin DBGrid_select.DefaultDrawColumnCell(Rect, DataCol, Column, State); end; end;
- la détection du champ REGROUPER est effective (j'ai un doute si 0 s'affiche) -> placer un point d'arrêt devant "DBGrid_select.Canvas.FillRect(Rect);" la détection sera immédiate à l'exécution bien qu'un peu pénible,
- le code de dessin est valide, pour ça, faire un essai séparé sur le canevas de la fiche.
@+
M E N S . A G I T A T . M O L E M
Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal
"La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."
Yahoooo ^^ ça marche Shai ^^ merciii
Merci tout le monde !!
Je vous met la photo en pièce jointe tellement c'est beau ^^
Encore merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 procedure TFS42.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin with Sender as TDBGrid do begin // On ne prend en compte que la colonne REGROUPER if sameText(Column.FieldName, 'REGROUPER') then begin { On efface la cellule } Canvas.FillRect(Rect); { Cochée ou Pas ?} dmImages.imgCheck.Draw(DBGrid1.Canvas, Rect.Left + ((Rect.Right - Rect.Left - dmImages.imgCheck.Width) div 2), Rect.Top, Column.Field.AsInteger // 0 = non coché, 1 coché ); end { si column ne correspond pas à une case à cocher, } { on ne s'occupe pas du dessin de la cellule, on } { transmet donc à DefaultDrawColumnCell } else begin DefaultDrawColumnCell(Rect, DataCol, Column, State); end; end; end;
Windows XP
Delphi 7
WinDev Mobile 17
Grillé de peu , j'allais proposer ce code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 // Gestion affichage de la grille procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var r : TRect; begin if Datacol=2 then begin r.Top:=Rect.Top+1; r.Bottom:=Rect.Bottom-1; r.Left:=Rect.Left+1; r.Right:=Rect.Right-1; DrawFrameControl((Sender as TDBGrid).Canvas.Handle,r,DFC_BUTTON, IfThen(ZQuery1.FieldByName('REGROUPER').asInteger=1, // <<<<<< ici la condition >>>>>> DFCS_CHECKED,DFCS_BUTTONCHECK)); end else DBGrid1.DefaultDrawColumnCell(Rect,Datacol,Column,State); end; // Gestion de la case a cocher procedure TForm1.DBGrid1CellClick(Column: TColumn); begin if Column.FieldName='REGROUPER' then begin ZQuery1.Edit; if ZQuery1REGROUPER.AsInteger=0 then ZQuery1REGROUPER.AsInteger:=1 else ZQuery1REGROUPER.AsInteger:=0; ZQuery1.Post; end; end;
MVP Embarcadero
Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
SGBD : Firebird 2.5, 3, SQLite
générateurs États : FastReport, Rave, QuickReport
OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd
Petite optimisation :
Ca m'embêtait de n'avoir rien à dire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 procedure TForm1.DBGrid1CellClick(Column: TColumn); begin if Column.FieldName='REGROUPER' then begin ZQuery1.Edit; ZQuery1REGROUPER.AsInteger:= 1 - ZQuery1REGROUPER.AsInteger; ZQuery1.Post; end; end;
M E N S . A G I T A T . M O L E M
Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal
"La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."
Je ne comprend pas votre façon d'écrire :
ZQuery1 c'est ma q_select et Zquery1REGROUPER ? On peut mettre .AsInteger sur une requête ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3ZQuery1.Edit; ZQuery1REGROUPER.AsInteger:= 1 - ZQuery1REGROUPER.AsInteger; ZQuery1.Post;
EDIT :
Pourquoi faire un - ?
Moi j'aurais fait un truc du genre (qui ne fonctionne pas forcément) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 q_select.Edit; q_select.FieldByName('REGROUPER').AsInteger:= 1; q_select.Post;
Windows XP
Delphi 7
WinDev Mobile 17
C'est avec des Champs persistants
C'est l'inspecteur d'objet qui permet de créer des champs avec des objets associés !
Oublie cette approche
Cela donne pour toi
Pour le 1 - REGROUPER il faut juste dérouler les clics :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 if Column.FieldName='REGROUPER' then begin q_select.Edit; q_select.FieldByName('REGROUPER').AsInteger:= 1 - q_select.FieldByName('REGROUPER').AsInteger; q_select.Post; end;
1er clic 1 - 0 -> 1 ,
2nd clid 1 - 1 -> 0,
3e clic 1 - 0 -> 1 ,
...
le IfThen (unité math) est peut-être un peu plus simple
Column donne accès à son Field
Field donne accès à son DataSet (q_select)
Cela donne un code plus facilement réutilisable
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 procedure TForm1.DBGrid1CellClick(Column: TColumn); begin if Column.FieldName='REGROUPER' then begin Column.Field.DataSet.Edit; Column.Field.AsInteger := IfThen(Column.Field.AsInteger = 0, 1, 0); Column.Field.DataSet.Post; end; end;
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Oui c'est e que j'ai fait le premier code, mais à quoi sert le??
Code : Sélectionner tout - Visualiser dans une fenêtre à part Column.Field.AsInteger:= IfThen(Column.Field.AsInteger = 0, 1, 0);
Et la deuxième méthode :
ça me dit la classe n'a pas de propriété par défaut. Aucune version surchargée de IfThen ne peut être appelée avec ces arguments...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 if Column.FieldName='REGROUPER' then begin Column.Field.DataSet.Edit; Column.Field.AsInteger:= IfThen(Column.Field[2] = 0, 1, 0); Column.Field.DataSet.Post; end; end;
Windows XP
Delphi 7
WinDev Mobile 17
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Si je laisse tout normal comme tu as mis :
ça me dit "Aucune version surchargée de 'IfThen' ne peut être appelée avec ces arguments."
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 if Column.FieldName='REGROUPER' then begin Column.Field.DataSet.Edit; Column.Field.AsInteger := IfThen(Column.Field.AsInteger = 0, 1, 0); Column.Field.DataSet.Post; end;
Windows XP
Delphi 7
WinDev Mobile 17
Pourquoi passer par une fonction sur un calcul aussi élémentaire ?
Encore si l'on avait l'opérateur de sélection du langage C, je comprendrais.
M E N S . A G I T A T . M O L E M
Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal
"La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager