Evaluer des variables de structure

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
michelmarchand
Messages : 20
Inscription : lun. 18/avr./2022 14:23

Evaluer des variables de structure

Message par michelmarchand »

Bonjour à tous
dans la fenêtre j'ai
Combo_0 = [ Classeur, Articles ]
combo_1 = [ CompteTiers, TypePiece, NumeroPiece, ..... ] en fonction du choix de combo_0
string_0 = Clé de recherche
listicon = création des colonnes en fonction de Combo_0 et Titre de colonne en fonction des Noms de Champs
si Affiche = #True ont crée la Colonne ( cà je sais faire )
comment faire ce si ci-dessous
If MyDb()\getgadgettext( Combo_0() )\getgadgettext( combo_1 ) ) = getgadgettext( string_0 )
s'il y a une solution

Code : Tout sélectionner

Structure Classeur
  NumEnrg.i
  CompteTiers.s
  TypePiece.s
  NumeroPiece.s
  DateEnrg.s
  Debit.s
  Credit.s
  Acompte.s
  DateEch.s
  FraisDiv.s
  TauxTva.s
  ModeRegl.s
;  List LigneDoc.Ligne()
EndStructure

Structure Db
  List Classeur.Classeur()
EndStructure

Global NewList MyDb.DB()

Structure Champs
  NomChamp.s
  Affiche.l
EndStructure

Structure Table
  Table.s
  List Champ.Champs() 
EndStructure

Global NewList table.table()

AddElement( table() )
table()\Table = "Classeur"
AddElement( table()\Champ() )
table()\Champ()\NomChamp = "NumeroPiece"
table()\Champ()\Affiche = #True
AddElement( table()\Champ() )
table()\Champ()\NomChamp = "DateEnrg"
table()\Champ()\Affiche = #True
AddElement( table()\Champ() )
table()\Champ()\NomChamp = "CompteTiers"
table()\Champ()\Affiche = #True
AddElement( table()\Champ() )
table()\Champ()\NomChamp = "Débit"
table()\Champ()\Affiche = #False
AddElement( table()\Champ() )
table()\Champ()\NomChamp = "TypePiece"
table()\Champ()\Affiche = #True

AddElement( table() )
table()\Table = "Articles"
AddElement( table()\Champ() )
table()\Champ()\NomChamp = "CodeArticles"
table()\Champ()\Affiche = #True
AddElement( table()\Champ() )
table()\Champ()\NomChamp = "Désignation"
table()\Champ()\Affiche = #True
AddElement( table()\Champ() )
table()\Champ()\NomChamp = "RefFournisseur"
table()\Champ()\Affiche = #True

AddElement( MyDb() )
AddElement( MyDb()\Classeur() )
MyDb()\Classeur()\NumeroPiece = "26632145"
MyDb()\Classeur()\DateEnrg    = "15/05/2022"
MyDb()\Classeur()\Debit       = "135.22"
MyDb()\Classeur()\CompteTiers = "401049"
MyDb()\Classeur()\TypePiece   = "Facture"

ForEach table()
  Debug "_____________________"
  Debug "> :" + table()\Table
  ForEach table()\Champ()
    Debug ">>>> :" + table()\Champ()\NomChamp
    If table()\Champ()\Affiche
      Debug ">>>>> :" + "#True"
    Else
      Debug ">>>>> :" + "#False"
    EndIf
  Next
Next
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Evaluer des variables de structure

Message par Ollivier »

Salut, par manque de temps, je t'oriente vers la même stratégie que celle conseillée par ArS : utiliser les maps, au moins pour commencer rapidement à traiter une base de données.

Code : Tout sélectionner

Global NewMap DB.S()
DB("JeSuisUneChaîne") = "Exemple de chaîne"
Tu choisis un caractère de séparation. Par exemple, les 2 points ':'. Et pour chaque objet, tu conviens d'un identifiant. On va prendre ici "Titine". Mais ça peut être n'importe quoi, un nombre, un code : tu es libre.

Code : Tout sélectionner

Global NewMap DB.S()

DB("Titine:Marque") = "Renault"
DB("Titine:Couleur") = "Rouge"
DB("Titine:Energie") = "Diesel"
DB("Titine:Puissance") = "70 chevaux"

; La profondeur est libre.
DB("Les Clos Fleuris:Bâtiment 1:Etage 4:Porte 2:Proprio") = "Durand"
Par contre, attention à la casse (majuscule/minuscule) : quand tu commences une habitude de casse, tu dois ensuite garder cette même habitude dans la map.

Pareil pour les habitudes d'espacement : si tu commences sans espace, tu dois garder cette habitude.

C'est le principe de la map : stocker des données en fonction d'une clé qui est une chaîne. Donc si la clé change d'un seul caractère, ce n'est pas le même accès, c'est un autre accès, donc une autre donnée. Exemple :

Code : Tout sélectionner

DB("pif") = "lundi"
DB("pif ") = "mardi"
Voilà les 1ers indices pour créer très rapidement une base de données, grâce à une map.

Ainsi, tu n'as plus besoin de créer une structure native à PureBasic. Avec une map, tes structures sont souples à volonté, modifiables et accessibles à la volée.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Evaluer des variables de structure

Message par Ollivier »

Concernant la récupération d'une structure native, les codes source sont dans des fichiers texte. Donc si tu as le nom de fichier de ton code source, tu peux traiter ce fichier, comme tu traiterais un fichier texte. De mémoire, la constante contenant le nom de ton fichier source est #PB_Editor_File. Dans un projet OpenSource, ça ne pose pas de souci. Mais si tu décides de ne pas divulguer le source, ce fichier texte est sensé ne plus exister dans le projet final, donc tes structures, les noms des composants (champs) deviennent introuvables.

Donc cette technique d'extraction est pleinement utile quand tu fabriques un outil de pré-processing (onglet "outil" dans l'éditeur).

C'est toute la subtilité du terme usuel "structure" : une structure en programmation c'est un ensemble de repères d'adresses mémoire que le compilateur va convertir durant la compilation. Ces structures ont un nombre de champs précis, et l'utilisateur final n'y a pas la possibilité de les réorganiser.

Les maps et les bases de données sont en principe potentiellement modifiables par l'utilisateur. Tu peux aussi créer une structure "noeud" :

Code : Tout sélectionner

; exemple
Structure Clef
 *Precedent  ; liens horizontaux
 *Racine        ; liens verticaux
 *Suivant       ; liens horizontaux
 
 Nom.S
 Type.I
 *Donnee
 
 *Enfant[0]    ; liens verticaux
EndStructure
Dans ce cas, tu dois gérer les ajouts/suppressions de liens. C'est plus terre à terre et rapide que les maps, ça fait un bon paquet de procédures à devoir programmer.
michelmarchand
Messages : 20
Inscription : lun. 18/avr./2022 14:23

Re: Evaluer des variables de structure

Message par michelmarchand »

Bonjour
j'ai suivi les conseils concernant les Maps et j'ai réaliser un test ci-joint, mais j'ai un problème d'ordre

Code : Tout sélectionner

Structure Table
  Map NomChamp.l( 10 )
EndStructure

Global NewMap Tables.Table(), Window_0, Combo_0, Text_0, Text_1, Combo_1, String_0, Text_2, Combo_2, String_1, Text_3, Combo_3, String_2, ListIcon_0, button_0

Tables("Classeur")
Tables()\NomChamp("CompteTiers")   = 0
Tables()\NomChamp("TypePièces")    = 1
Tables()\NomChamp("Date Création") = 2
Tables()\NomChamp("Débit")         = 3
Tables()\NomChamp("Crédit")        = 4

Tables("Articles")
Tables()\NomChamp("CodeArticles")         = 1
Tables()\NomChamp("Désignation")          = 2
Tables()\NomChamp("Reférence Fourisseur") = 3
Tables()\NomChamp("Px Net Ht")            = 4
Tables()\NomChamp("Entrée")               = 5
Tables()\NomChamp("Sortie")               = 6

Procedure OpenWindow_0(x = 0, y = 0, width = 624, height = 400)
  Window_0 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu)
  Combo_0 = ComboBoxGadget(#PB_Any, 48, 72, 128, 20)
  Text_0 = TextGadget(#PB_Any, 48, 48, 128, 20, "Table", #PB_Text_Center)
  Text_1 = TextGadget(#PB_Any, 48, 128, 128, 20, "Critère 1", #PB_Text_Center)
  Combo_1 = ComboBoxGadget(#PB_Any, 48, 152, 128, 20)
  String_0 = StringGadget(#PB_Any, 48, 176, 128, 20, "")
  Text_2 = TextGadget(#PB_Any, 200, 128, 96, 20, "Critère 2", #PB_Text_Center)
  Combo_2 = ComboBoxGadget(#PB_Any, 192, 152, 104, 20)
  String_1 = StringGadget(#PB_Any, 192, 176, 104, 20, "")
  Text_3 = TextGadget(#PB_Any, 312, 128, 96, 20, "Critère 3", #PB_Text_Center)
  Combo_3 = ComboBoxGadget(#PB_Any, 312, 152, 96, 20)
  String_2 = StringGadget(#PB_Any, 312, 176, 96, 20, "")
  button_0 = ButtonGadget( #PB_Any, 452, 152, 100, 20, "Rechercher" )
  
  ListIcon_0 = ListIconGadget(#PB_Any, 16, 216, 592, 152, "", 100)
  DisableGadget( Combo_1, #True )
  DisableGadget( Combo_2, #True )
  DisableGadget( Combo_3, #True )
  DisableGadget( String_0, #True )
  DisableGadget( String_1, #True )
  DisableGadget( String_2, #True )
  
  ForEach Tables()   
    AddGadgetItem( Combo_0, -1, MapKey( Tables() ) )  
  Next  
  
EndProcedure

Procedure Window_0_Events()
  Repeat
    event = WaitWindowEvent()
    Select event
      Case #PB_Event_CloseWindow
        ProcedureReturn #False
      Case #PB_Event_Menu
        Select EventMenu()
        EndSelect
      Case #PB_Event_Gadget
        Select EventGadget()
          Case Combo_0
            Select EventType()
              Case #PB_EventType_Change
                ; ______________________________
                ResetMap( Tables() )
                ClearGadgetItems( Combo_1 )
                FindMapElement( Tables(), GetGadgetText( Combo_0 ) )
                ResetMap( Tables()\NomChamp() )
                ClearGadgetItems( ListIcon_0 )
                RemoveGadgetColumn( ListIcon_0, #PB_All )
                ForEach Tables()\NomChamp()
                  AddGadgetItem( Combo_1, -1, MapKey( Tables()\NomChamp() )  )
                  FindMapElement( Tables()\NomChamp(), MapKey( Tables()\NomChamp() ) )
                  AddGadgetColumn( ListIcon_0, Tables()\NomChamp(), MapKey( Tables()\NomChamp() ), 100 ) ; L'Ordre ne correspond pas
                Next
                ; ______________________________                
                DisableGadget( Combo_1, #False )
                DisableGadget( String_0, #False )
            EndSelect
          Case Combo_1
            Select EventType()
              Case #PB_EventType_Change
            EndSelect
          Case button_0
        EndSelect
    EndSelect
  Until Event = #PB_Event_CloseWindow
EndProcedure

OpenWindow_0( 0, 0, 624, 400)
Window_0_Events()
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Evaluer des variables de structure

Message par Ollivier »

Tu peux rajouter, si nécessaire, un index avec Str() dans le nom de la clé. Je vois ceci :

Code : Tout sélectionner

Tables()\NomChamp("CompteTiers") = 0
Peut-être est-ce aussi un peu trop "chargé" ? Je vois aussi que tu veux des valeurs entières. Un exemple :

Code : Tout sélectionner

Global NewMap DI.I()
Global NewMap DD.D()
Global NewMap DS.S()

DS("Table:1:Nom:1") = "Compte tiers"
DS("Table:1:Nom:2") = "Type Pièce"
; etc...
C'est une suggestion concernant les moyens permis avec les maps.
DI et DD permettent de stocker des nombres entiers et flottants respectivement.
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: Evaluer des variables de structure

Message par Marc56 »

Bonjour,
(Juste pour info)

En travaillant avec des structures tu vas rapidment te trouver avec quelque-chose de très difficile à gérer.
Un système de gestion se construit le plus souvent autour d'une base de donnée car les requètes sont bien plus simples et rapides et même stable.
On charge les références dans les oblets (dropbox ou autre) et on interroge la base en SQL.
Pas de risque de perte de données en cas d'erreur (alors qu'un JSON c'est tout ou rien à l'écriture)
On peut utiliser des outils externes pour les imports/exports/sauvegardes

PB gère nativement SQLite, PostgreSQL, MySQL/MariaDB et pour le reste, tout se qui est accesible en ODBC
- Ton programme est mono-utilisateur ou multi-utilisateur mais avec écriture brèves: SQLite
- Ton programme est multi-utilisateurs: PostgreSQL (ou MariaDB/MySQL)
:wink:
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Evaluer des variables de structure

Message par Ollivier »

Donc, pour revenir à ta question :

If MyDb()\getgadgettext( Combo_0() )\getgadgettext( combo_1 ) ) = getgadgettext( string_0 )

il semble manquer une précision :

- string_0 indique-t-il par exemple "Classeur:CompteTiers" ? (ou un abrégé comme "CCT")

ou bien

- string_0 indique-t-il un/des mot-clé(s) de recherche parmi les éléments dans une table choisie par les combos ?
michelmarchand
Messages : 20
Inscription : lun. 18/avr./2022 14:23

Re: Evaluer des variables de structure

Message par michelmarchand »

Bonjour Olivier
MyDb()\Classeur()\CompteTiers = Getgadgettext( String_0 ) (Clé de recherche)
MyDb() contient les Tables (Classeur, Articles,.....)
MyDb()\Getgadgettext( Combo_0 ) ( la Table Classeur )
MyDb()\Getgadgettext( Combo_0 )\Getgadgettext( Combo_1 ) ( le Champ de ta Classeur : Competiers )
Foreach MyDb()\Classeur()
If MyDb()\getgadgettext( Combo_0 )\getgadgettext( combo_1 ) ) = getgadgettext( string_0 )
AddGadetItem( Listicon_0, (l'index), ( Champs+Chr(10)+.... )

ou bien

- string_0 indique-t-il un/des mot-clé(s) de recherche parmi les éléments dans une table choisie par les combos ?
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Evaluer des variables de structure

Message par Ollivier »

michelmarchand a écrit : jeu. 19/mai/2022 6:26 Bonjour Olivier
MyDb()\Classeur()\CompteTiers = Getgadgettext( String_0 ) (Clé de recherche)
MyDb() contient les Tables (Classeur, Articles,.....)
MyDb()\Getgadgettext( Combo_0 ) ( la Table Classeur )
MyDb()\Getgadgettext( Combo_0 )\Getgadgettext( Combo_1 ) ( le Champ de ta Classeur : Competiers )
Foreach MyDb()\Classeur()
If MyDb()\getgadgettext( Combo_0 )\getgadgettext( combo_1 ) ) = getgadgettext( string_0 )
AddGadetItem( Listicon_0, (l'index), ( Champs+Chr(10)+.... )

ou bien

- string_0 indique-t-il un/des mot-clé(s) de recherche parmi les éléments dans une table choisie par les combos ?
Bonjour MichelMarchand,

apparemment, ta réponse c'est les deux réponses. C'est compliqué, cependant, ça se résume à ça :
1) peut être un sigle de choix des 2 combos
ou bien
2) peut être un mot-clé de recherche dans une des tables définies par les deux combos.

Dans le second cas, ça nécessite de créer un dictionnaire en map :

Code : Tout sélectionner

Global NewMap dic.S()
Et on doit se taper effectivement la corvée du chargement du vocabulaire utilisé par la base de données.

On va abandonner les maps. Ce n'est pas que les maps, c'est sale, mais si la gestion SQL est déjà inclue dans le langage, autant ne pas forcément réinventer la roue...
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Evaluer des variables de structure

Message par Ollivier »

Alors... Pour les bases de données, je te présente Lucky Luke, alias falsam qui s'est souvent attardé à tenter d'expliquer maintes fois les joies d'une gestion de base de données SQL à des nabots comme moi, qui s'en moquent de la gestion de base de données SQL.

Donc, pour bien commencer, un tuto SQL viewtopic.php?t=12311
michelmarchand
Messages : 20
Inscription : lun. 18/avr./2022 14:23

Re: Evaluer des variables de structure

Message par michelmarchand »

Bonjour Olivier
après maintes essai avec les listes chainée avec sauvegarde Json
je suis coincé avec ma recherche multi-critère
j'ai testé l'exemple Sqlite de Falsam très bien explicité
je vais me re-concentrer sur cette gestion de base de données
Encore merci pour ton aide
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Evaluer des variables de structure

Message par Ollivier »

Quand c'est des petites listes (ou tables), tu peux te permettre de créer toi-même le système de recherche.

Mais pour de grosses listes (plus de 100 000 éléments), tu dois élaborer un système de recherche lourd en code pour être très rapide. Le traitement SQL gère déjà tout ça.

À la limite (et c'est mon esprit parano), si tu traites une base de données avec des identités, (ex: porte-feuille client) dans ce cas, tout contrôler, tout gérer par tes propres algos n'est pas un luxe mais un gage de sécurité. Tu t'éloignes d'un standard de données donc tu diversifies la méthode de sécurité.

N'hésite pas à continuer de créer un sujet pour une question, avec un titre qui synthétise bien ta demande, que ce soit en SQL ou pas.

J'espère aussi que tu as découvert la librairie interne gérant les chaînes https://www.purebasic.com/french/docume ... index.html. C'est très important : là, encore, si tu as la moindre question concernant l'utilité d'une fonction, n'hésite pas !

Bonne prog !
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Evaluer des variables de structure

Message par Ollivier »

Michel va me prendre pour un boulet, mais bon... Mieux vaut tard que jamais, et assumer son ignorance !

Donc, après une brève et fraîche lecture sur le forum US ici, voici une page de la doc qui répondra à tes besoins (oui, deux mois après ta demande, je sais, j'assume).

https://www.purebasic.com/french/docume ... cture.html
Répondre