EstDansTableauNumeric - 13/12/2024 09:04:23

Disponible via SQL

Capable de process préemptif

      #DECLARE($nomTab : Text; $valeur : Integer)->$result : Integer
// test si $2 est dans le tableau de nom $1
var $ptr : Pointer

$ptr:=Get pointer($nomTab)
If (Type($ptr->)=LongInt array)
	$result:=Find in array($ptr->; $valeur)
	
Else 
	$result:=-1
End if 


    

traceHandler - 26/02/2025 09:40:39

Disponible via SQL

Capable de process préemptif

      // interception d'une erreur
var $erreur : Integer

$erreur:=cs.xSDK.Traces.new().Intercepter("SQL"; Error; Error method; Error line; Error formula)

    

Bac à sable SQL - 24/09/2025 18:01:42

      cs.xSDK.TraductionsEditeur.new().ModifierTraductions()

    

[class]wwwGroupes - 29/05/2025 15:03:58

      // attributs de la classe
property nom : Text
property Proprietaire; IDfamille : Integer

Class extends _SQLentite

Class constructor($IDentity : Variant)
	// initialiser l'objet avec les données de l'entité $IDunique de la BDD
	var $ID : Integer
	
	Super("wwwGroupes"; $IDentity; 24)
	
	// les infos
	$ID:=This.ID
	This.InitVarProcessSQL()
	
	Try
		Begin SQL
			SELECT nom, Proprietaire, IDfamille FROM wwwGroupes WHERE ID = :$ID INTO :varText1, :varInteger1, :varInteger2;
		End SQL
		
	Catch
		// la table n'existe pas (test des composants)
		varText1:="Vampires"
		varInteger1:=12345
		varInteger2:=67890
	End try
	
	// enregistrer ce qu'on a trouvé (ou les valeurs par défaut)
	This.nom:=varText1
	This.Proprietaire:=varInteger1
	This.IDfamille:=varInteger2
	
    

[class]_SQL_DataStore - 11/02/2026 08:16:34

      
Class constructor()
	
	var varInteger1; varInteger2; varInteger3; varInteger4 : Integer
	var varReal1; varReal2 : Real
	var varText1; varText2; varText3; varText4; varText5; varText6; varText7 : Text
	var varPicture1; varPicture2 : Picture
	var varDate : Date
	var varTime : Time
	var varBool : Boolean
	
	
Function InitVarProcessSQL()
	varInteger1:=-Random
	varInteger2:=0
	varInteger3:=0
	varInteger4:=0
	varText1:=Generate UUID
	varText2:=""
	varText3:=""
	varText4:=""
	varText5:=""
	varText6:=""
	varText7:=""
	CLEAR VARIABLE(varPicture1)
	varReal1:=0
	varReal2:=0
	CLEAR VARIABLE(varDate)
	CLEAR VARIABLE(varTime)
	varBool:=False
	
	
	// ----------------------
	//MARK:Création
	// -----------------------
	
Function setEntités($DataClassNom : Text; $c : Collection)->$result : Collection
	var $ID : Integer
	
	$result:=New collection
	Case of 
		: ($DataClassNom="")
		: ($c.length=0)
		Else 
			For each ($ID; $c)
				$result.push(cs[$DataClassNom].new($ID))
			End for each 
	End case 
	
    

[class]_SQLentite - 22/08/2025 14:53:06

      property DataClassNom; IDunique : Text
property numTable; ID : Integer

Class extends _SQL_DataStore

Class constructor($DataClassNom : Text; $IDentity : Variant; $numTable : Integer)
	var $UUID; $texte : Text
	var $ID : Integer
	
	Super()
	
	This.DataClassNom:=$DataClassNom
	This.numTable:=$numTable
	
	// si $IDentity n'existe pas en BDD (nouvelle entité pour la saisie), initialiser les ID et IDunique d'une entité vide
	
	// trouver ID / IDunique de l'entité demandée
	// construire la requête (les variables locales ne sont pas admises, cf doc 4D)
	$texte:=""
	Case of 
		: ($IDentity=Null)
			// cette classe a ni ID, ni IDunique
			
		: (Value type($IDentity)=Is text)
			// il faut retyper $IDentity
			$UUID:=$IDentity
			$texte:="SELECT ID, IDunique FROM "+This.DataClassNom+" WHERE IDunique = '"+$UUID+"' INTO :varInteger1, :varText1;"
			
		: ((Value type($IDentity)=Is longint) | (Value type($IDentity)=Is real))
			// il faut retyper $IDentity
			$ID:=$IDentity
			$texte:="SELECT ID, IDunique FROM "+This.DataClassNom+" WHERE ID = "+String($ID)+" INTO :varInteger1, :varText1;"
	End case 
	
	If ($texte#"")
		This.InitVarProcessSQL()
		
		Try
			Begin SQL
				EXECUTE IMMEDIATE :$texte;
			End SQL
			
		Catch
			// la table n'existe pas (test des composants)
			varInteger1:=-Random
			varText1:="00000000000000000000000000000000"
		End try
		
		// enregistrer ce qu'on a trouvé (ou les valeurs par défaut)
		This.ID:=varInteger1
		This.IDunique:=varText1
	End if 
	
	
Function IDcodé()->$IDcodé : Integer
	$IDcodé:=(This.numTable << 24) | This.ID
	
	
	// ----------------------
	//MARK:Entité
	// -----------------------
	
Function LireLocatedSTR($ID : Integer; $options : Object)->$result : Text
	var $début; $fin : Integer
	var $libellé; $texte; $balise; $newTexte : Text
	var $UserPrefs : Object
	var $c; $cEl : Collection
	
	$UserPrefs:=New object  // vide
	
	$texte:=Localized string(String($ID))
	
	// rechercher dans $texte une balise d'un type de $c à partir de $début
	// une balise est la forme :typeBalise?xxxx:
	
	// d'abord chercher les balises xCode, référant un élément de langages
	$c:=New collection(":xCode")
	
	For each ($libellé; $c)
		$début:=1
		While ($début>0)
			// chercher la balise
			$fin:=Position($libellé; $texte; $début; *)
			
			If ($fin=0)
				// c'est fini : arrêter la recherche
				$début:=-1
				
			Else 
				// récupérer la balise
				$début:=$fin
				$fin:=Position(":"; $texte; $début+1; *)
				$balise:=Substring($texte; $début; $fin-$début+1)  // balise à remplacer
				
				// récupérer les paramètres
				$newTexte:=Substring($balise; 2; Length($balise)-2)  // virer les marqueurs (plus propre)
				$cEl:=Split string($newTexte; "?"; sk ignore empty strings)
				// plusieurs cas
				Case of 
						// il faut avoir trouvé la fin de la balise
					: ($fin=0)
						$début:=0
						$newTexte:=""
						
						// il faut au moins 1 élément
					: ($cEl.length=0)
						// effacer la balise
						$texte:=Replace string($texte; $balise; "")
						
						// calculer le texte remplaçant la balise
					: ($libellé=":xCode")
						Case of 
								// traiter les balises dont la valeur est contextuelle (paramètres de la méthode)
							: ($cEl[1]="genre")
								Case of 
									: (Not(OB Is defined($UserPrefs; "Apparence")))
										// la langue n'est pas toujours définie (exemple : à l'ouverture de l'application, et avant l'ouverture de session)
										// imposer le français
										$newTexte:="e"*Num($options.genre)
										
									: ($UserPrefs.Apparence.CodeLangue="fr")
										$newTexte:="e"*Num($options.genre)
										
									Else 
										$newTexte:="?"
								End case 
								
							: ($cEl[1]="plur")
								Case of 
									: (Not(OB Is defined($UserPrefs; "Apparence")))
										// la langue n'est pas toujours définie (exemple : à l'ouverture de l'application, et avant l'ouverture de session)
										// imposer le français
										$newTexte:="s"*Num($options.plur)
										
									: ($UserPrefs.Apparence.CodeLangue="fr")
										$newTexte:="s"*Num($options.plur)
										
									: ($UserPrefs.Apparence.CodeLangue="en")
										$newTexte:="s"*Num($options.plur)
									Else 
										$newTexte:="?"
								End case 
								
								
								// pour le reste, il faut au moins 2 éléments
							: ($cEl.length<3)
								// effacer la balise
								$newTexte:=""
								
								// une variable, sa valeur est renseignée dans Storage.STR
							: ($cEl[1]="variable")
								$newTexte:="err :xCode?variable"
								Case of 
									: (Not(OB Is defined(Storage; "STR")))
									: (Not(OB Is defined(Storage.STR; $cEl[2])))
										// pas créée
										$newTexte:="err "+$cEl[2]
									Else 
										// c'est ok
										$newTexte:=Storage.STR[$cEl[2]]
								End case 
						End case 
						
					Else 
						// on ne sait pas
						$newTexte:="err locatedSTR "
				End case 
				// traduire la balise (il peut y en avoir plusieurs)
				$texte:=Replace string($texte; $balise; $newTexte)
				
				// continuer
				$début:=$début+Length($newTexte)
			End if 
		End while 
		
		// balise suivante
	End for each 
	
	$result:=$texte
	
	
	// ----------------------
	//MARK:Sélection
	// -----------------------
	
Function setEntités($DataClassNom : Text; $prtTab : Pointer)->$result : Collection
	// créer une sélection d'entités de this avec les ID de $ptrTab
	var $c : Collection
	
	$result:=New collection
	
	If (Type($prtTab->)=LongInt array)
		$c:=New collection
		ARRAY TO COLLECTION($c; $prtTab->)
		$result:=Super.setEntités($DataClassNom; $c)
	End if 
    

[class]Regions - 29/05/2025 14:52:03

      // attributs de la classe
property nom : Text
property blason : Picture
property latitude; longitude : Real
property lePays : cs.Pays

Class extends _SQLentite

Class constructor($IDentity : Variant)
	// initialiser l'objet avec les données de l'entité $IDunique de la BDD
	var $ID : Integer
	
	Super("Regions"; $IDentity; 15)
	
	$ID:=This.ID
	This.InitVarProcessSQL()
	
	Try
		Begin SQL
			SELECT nom, blason, pays, latitude, longitude FROM Regions WHERE Regions.ID = :$ID INTO  :varText1,  :varPicture1, :varInteger1, :varReal1, :varReal2;
		End SQL
		
	Catch
		// la table n'existe pas (test des composants)
		varText1:="Mordor"
		READ PICTURE FILE(Folder(fk resources folder).folder("Images").file("19200.png").platformPath; varPicture1)
		varInteger1:=-2
		varReal1:=45.2
		varReal2:=0.2
	End try
	
	// enregistrer ce qu'on a trouvé (ou les valeurs par défaut)
	This.nom:=varText1
	This.blason:=varPicture1
	This.latitude:=varReal1
	This.longitude:=varReal2
	
	// reconstituer la hiérarchie administrative : pays de la région
	// le pays
	This.lePays:=cs.Pays.new(varInteger1)
	
	
Function Libellé($formats : Object)->$libellé : Text
	// renvoie le nom formaté suivant les options $1
	// function identique à celle de la BDDmère
	// $formats
	// .Options 
	//   bit 19 = ajouter le pays
	//   bit 23 = région
	
	$libellé:=(This.nom*Num($formats.Options ?? 23))+((" ("+This.lePays.nom+")")*Num($formats.Options ?? 19))
	
	
	// ----------------------
	//MARK:Sélections
	// -----------------------
	
Function Le($DataClassNom : Text)->$result : Object
	// renvoie l'entité [$DataClassNom]
	If ($DataClassNom=This.DataClassNom)
		$result:=This
	Else 
		$result:=This.lePays.Le($DataClassNom)
	End if 
	
    

[class]EventsSelect - 26/09/2025 18:04:59

      Class extends _SQLentiteSelect

Class constructor($requête : Variant)
	
	Super("Events"; $requête; 9)
	
	
Function Chercher($params : Object)->$result : cs.EventsSelect
	var $typeMin; $typeMax : Integer
	var $dateMin; $dateMax : Date
	
	// par défaut on prend tout
	$typeMin:=0
	$typeMax:=99999
	$dateMin:=!100-01-01!
	$dateMax:=!3000-01-01!  // y a de la marge !
	This._ValiderSaisie($params; ->$typeMin; ->$typeMax; ->$dateMin; ->$dateMax)
	
	ARRAY LONGINT($tabID; 0)
	Begin SQL
		SELECT ID FROM Events WHERE (type >= :$typeMin) AND (type <= :$typeMax) AND (dateNum >= :$dateMin) AND (dateNum <= :$dateMax) INTO :$tabID;
	End SQL
	
	ARRAY TO COLLECTION(This.collection; $tabID)
	
	// il peut y avoir la valeur 0 (un NULL quelque part?)
	// ?????? This.collection:=This.collection.filter(Formula($1.value>$2); 0)
	
	// pour le chainage des functions
	$result:=This
	
	
Function _ValiderSaisie($params : Object; $ptrTypeMin : Pointer; $ptrTypeMax : Pointer; $ptrDateMin : Pointer; $ptrDateMax : Pointer)
	Case of 
		: (Not(OB Is defined($params; "typeMin")))
		: (Not(OB Is defined($params; "typeMax")))
		Else 
			$ptrTypeMin->:=OB Get($params; "typeMin"; Is longint)
			$ptrTypeMax->:=OB Get($params; "typeMax"; Is longint)
	End case 
	
	If (OB Is defined($params; "dateMin"))
		$ptrDateMin->:=OB Get($params; "dateMin"; Is date)
	End if 
	If (OB Is defined($params; "dateMax"))
		$ptrDateMax->:=OB Get($params; "dateMax"; Is date)
	End if 
	
	
Function LesProtagonistes()->$result : Collection
	// trouver toutes les personnes associées à cette sélection d'events
	var $c : Collection
	
	ARRAY LONGINT(tabID; 0)
	COLLECTION TO ARRAY(This.collection; tabID)
	
	ARRAY LONGINT($tabID1; 0)
	ARRAY LONGINT($tabID2; 0)
	
	Try
		// ceux des events mariage puis ceux des events perso
		Begin SQL
			SELECT Relations.membre FROM EventsFam
			LEFT OUTER JOIN (Unions LEFT OUTER JOIN Relations ON Unions.couple = Relations.groupe)
			ON EventsFam.famille = Unions.ID
			WHERE  {fn EstDansTableauNumeric('tabID',EventsFam.evenement) AS NUMERIC} > -1
			INTO :$tabID1;
			
			SELECT DISTINCT Personnes.ID
			FROM EventsPerso
			INNER JOIN Personnes ON EventsPerso.personne = Personnes.ID
			WHERE {fn EstDansTableauNumeric('tabID',EventsPerso.evenement) AS NUMERIC} > -1
			INTO :$tabID2;
		End SQL
		
	Catch
		APPEND TO ARRAY($tabID1; -1)
		APPEND TO ARRAY($tabID2; -1)
	End try
	
	// créer la collection globale
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID1)
	$c:=New collection
	ARRAY TO COLLECTION($c; $tabID2)
	$result:=$result.concat($c).distinct()
	
    

[class]DossiersSelect - 07/08/2024 12:05:30

      Class extends _SQLentiteSelect

Class constructor($requête : Variant)
	
	Super("Dossiers"; $requête; 27)
	
	
    

[class]EventsFam - 29/05/2025 14:41:49

      // attributs de la classe
property evenement; Groupe1; Groupe2; famille : Integer

Class extends _SQLentite

Class constructor($IDentity : Integer)
	// initialiser l'objet avec les données de l'entité $IDentity de la BDD
	var $ID : Integer
	
	// attention, cette classe a ni ID, ni IDunique. ici super() ne fonctionne pas
	Super("EventsFam"; Null; 8)
	
	This.evenement:=$IDentity
	
	// lire les données de l'event
	$ID:=This.evenement
	This.InitVarProcessSQL()
	
	Try
		Begin SQL
			SELECT Groupe1, Groupe2, famille FROM EventsFam WHERE evenement = :$ID INTO :varInteger1, :varInteger2, :varInteger3;
		End SQL
		
	Catch
		// la table n'existe pas (test des composants)
		varInteger1:=Random
		varInteger2:=Random
		varInteger3:=1000
	End try
	
	// enregistrer ce qu'on a trouvé (ou les valeurs par défaut)
	This.Groupe1:=varInteger1
	This.Groupe2:=varInteger2
	This.famille:=varInteger3
	
	
Function LesTémoins($groupe : Text)->$result : Collection
	var $ID : Integer
	
	$ID:=This[$groupe]
	ARRAY LONGINT($tabID; 0)
	Begin SQL
		SELECT membre FROM Relations WHERE groupe = :$ID INTO :$tabID;
	End SQL
	
	$result:=This.setEntités("Personnes"; ->$tabID)
	
    

[class]Sites - 20/09/2025 10:46:27

      // attributs de la classe
property type : Integer
property nom : Text
property laCommune : cs.Communes

Class extends _SQLentite

Class constructor($IDentity : Variant)
	// initialiser l'objet avec les données de l'entité $IDunique de la BDD
	var $ID : Integer
	
	Super("Sites"; $IDentity; 12)
	
	// lire les données du site
	$ID:=This.ID
	This.InitVarProcessSQL()
	
	Try
		Begin SQL
			SELECT  type, nom, commune FROM Sites WHERE Sites.ID = :$ID INTO :varInteger2, :varText1, :varInteger1;
		End SQL
		
	Catch
		// la table n'existe pas (test des composants)
		varText1:="Citadelle"
		varInteger2:=50200
		varInteger1:=-2
	End try
	
	// enregistrer ce qu'on a trouvé (ou les valeurs par défaut)
	This.type:=varInteger2
	This.nom:=varText1
	
	// reconstituer la hiérarchie administrative : commune, département, région et pays du site
	// la commune
	This.laCommune:=cs.Communes.new(varInteger1)
	
	
	// ----------------------
	//MARK:Sélections
	// -----------------------
	
Function Le($DataClassNom : Text)->$result : Object
	// renvoie l'entité [$DataClassNom]
	If ($DataClassNom=This.DataClassNom)
		$result:=This
	Else 
		$result:=This.laCommune.Le($DataClassNom)
	End if 
	
	
Function LesLieux()->$result : Collection
	// créer la collection des lieux du site
	var $ID : Integer
	
	$ID:=This.ID
	ARRAY LONGINT($tabID; 0)
	
	Try
		Begin SQL
			SELECT Lieux.ID
			FROM Lieux
			WHERE Lieux.site = :$ID 
			INTO :$tabID;
		End SQL
		
	Catch
		APPEND TO ARRAY($tabID; -1)
		APPEND TO ARRAY($tabID; -2)
	End try
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
    

[class]Unions - 29/05/2025 15:02:46

      // attributs de la classe
property SansEnfant : Boolean

Class extends _SQLentite

Class constructor($IDentity : Variant)
	// initialiser l'objet avec les données de l'entité $IDunique de la BDD
	var $ID : Integer
	
	Super("Unions"; $IDentity; 5)
	
	// lire les données de l'union
	$ID:=This.ID
	This.InitVarProcessSQL()
	
	Try
		Begin SQL
			SELECT SansEnfant FROM Unions WHERE ID = :$ID INTO :varBool;
		End SQL
		
	Catch
		// la table n'existe pas (test des composants)
		varBool:=False
	End try
	
	// enregistrer ce qu'on a trouvé (ou les valeurs par défaut)
	This.SansEnfant:=varBool
	
	
Function LesEvents()->$result : Collection
	// récupérer les events fam
	// attention il peut ne pas y en avoir
	var $ID : Integer
	
	$ID:=This.ID
	ARRAY LONGINT($tabID; 0)
	Begin SQL
		SELECT Events.ID FROM Events
		INNER JOIN EventsFam ON Events.ID = EventsFam.evenement
		WHERE  EventsFam.famille = :$ID
		ORDER BY Events.dateNum ASC
		INTO :$tabID;
	End SQL
	
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
	
Function LesProtagonistes()->$result : Collection
	// collectionner les personnes de l'union
	var $ID : Integer
	
	$ID:=This.ID
	ARRAY LONGINT($tabID; 0)
	Begin SQL
		SELECT DISTINCT Relations.membre
		FROM Relations 
		WHERE groupe IN (SELECT couple FROM Unions WHERE ID = :$ID) 
		INTO :$tabID;
	End SQL
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
	
Function LesEnfants()->$result : Collection
	// collecter les enfants de l'union
	// attention il peut ne pas y en avoir
	var $ID : Integer
	
	$ID:=This.ID
	ARRAY LONGINT($tabID; 0)
	Begin SQL
		SELECT Personnes.ID FROM Personnes
		WHERE  Personnes.parents = :$ID
		INTO :$tabID;
	End SQL
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
	
    

[class]EventsPerso - 29/05/2025 14:45:51

      // attributs de la classe
property evenement; Groupe1; Groupe2; personne : Integer

Class extends _SQLentite

Class constructor($IDentity : Integer)
	// initialiser l'objet avec les données de l'entité $IDentity de la BDD
	var $ID : Integer
	
	// attention, cette classe a ni ID, ni IDunique. ici super() ne fonctionne pas
	Super("EventsPerso"; Null; 7)
	
	This.evenement:=$IDentity
	
	// lire les données de l'event
	$ID:=This.evenement
	This.InitVarProcessSQL()
	
	Try
		Begin SQL
			SELECT Groupe1, Groupe2, personne FROM EventsPerso WHERE evenement = :$ID INTO  :varInteger1, :varInteger2, :varInteger3;
		End SQL
		
	Catch
		// la table n'existe pas (test des composants)
		varInteger1:=Random
		varInteger2:=Random
		varInteger3:=1
	End try
	
	// enregistrer ce qu'on a trouvé (ou les valeurs par défaut)
	This.Groupe1:=varInteger1
	This.Groupe2:=varInteger2
	This.personne:=varInteger3
	
	
Function LesTémoins($groupe : Text)->$result : Collection
	var $ID : Integer
	
	$ID:=This[$groupe]
	ARRAY LONGINT($tabID; 0)
	Begin SQL
		SELECT membre FROM Relations WHERE groupe = :$ID INTO :$tabID;
	End SQL
	
	$result:=This.setEntités("Personnes"; ->$tabID)
	
    

[class]DicoDesNomsSelect - 05/06/2024 11:09:35

      Class extends _SQLentiteSelect

Class constructor($requête : Variant)
	
	Super("DicoDesNoms"; $requête; 3)
	
    

[class]UtilisateursALV - 11/02/2026 08:15:58

      // attributs de la classe
property LogIn; Password; Name; First_Name; AdresseEmail; IDunique; privileges : Text
property droits : Integer
property leGroupe : cs.wwwGroupes

Class extends _SQLentite

Class constructor($IDentity : Variant)
	// initialiser l'objet avec les données de l'entité $IDunique de la BDD
	var $ID : Integer
	var $LogIn : Text
	
	Super("UtilisateursALV"; $IDentity; 31)
	
	// cas où la classe est créée avec un LogIn
	Case of 
		: (This.ID>0)
			// on a l'entité de BDD
		: (Value type($IDentity)#Is text)
			// il faut un login
		Else 
			$LogIn:=$IDentity
			This.InitVarProcessSQL()
			
			Try
				Begin SQL
					SELECT ID FROM UtilisateursALV WHERE LogIn = :$LogIn INTO  :varInteger1;
				End SQL
				
			Catch
				varInteger1:=-Random
			End try
			
			This.ID:=varInteger1
	End case 
	
	// récupérer les données de l'utilisateur
	$ID:=This.ID
	This.InitVarProcessSQL()
	
	Try
		Begin SQL
			SELECT LogIn, Password, Name, First_Name, Adresse_eMail, IDunique, droits, Groupe, privileges FROM UtilisateursALV WHERE ID = :$ID INTO :varText6, :varText2, :varText3, :varText4, :varText5, :varText1, :varInteger2, :varInteger1, :varText7;
		End SQL
		
	Catch
		// la table n'existe pas (test des composants)
		varText7:=""
		varText6:=""
		varText2:=""
		varText3:="Lucifer"
		varText4:="Biibiipsou"
		varText5:="Lucifer.Biibiipsou@pipo.fr"
		varText1:=Generate UUID
		varInteger1:=-2
		varInteger2:=40
	End try
	
	// enregistrer ce qu'on a trouvé (ou les valeurs par défaut)
	This.LogIn:=varText6
	This.Password:=varText2
	This.Name:=varText3
	This.First_Name:=varText4
	This.AdresseEmail:=varText5
	This.IDunique:=varText1
	This.droits:=varInteger2
	This.privileges:=varText7
	
	// ajouter le groupe familial
	This.leGroupe:=cs.wwwGroupes.new(varInteger1)
	
	
Function Libellé($formats : Object)->$libellé : Text
	// renvoie le nom formaté suivant les options $formats
	// $formats
	// .Options 
	//   bit  0 = ajouter le nom
	//   bit  1 = ajouter le prénom
	//   bit  3 = d'abord le prénom
	
	$libellé:=""
	
	If (This#Null)
		$libellé:=(This.First_Name)*Num($formats.Options ?? 1)  //  bit 1 = ajouter le prénom
		
		If ($formats.Options ?? 3)  // d'abord le prénom
			$libellé:=$libellé+((" "*Num($formats.Options ?? 1))+This.Name)*Num($formats.Options ?? 0)  //  bit 0 = ajouter le nom
		Else 
			$libellé:=(This.Name+(" "*Num($formats.Options ?? 1)))*Num($formats.Options ?? 0)+$libellé  //  bit 0 = ajouter le nom
		End if 
		
	Else 
		$libellé:=Lowercase(Localized string("1004"))
	End if 
	
    

[class]Dossiers - 29/05/2025 15:03:15

      // attributs de la classe
property volume : Integer

Class extends _SQLentite

Class constructor($IDentity : Variant)
	// initialiser l'objet avec les données de l'entité $IDunique de la BDD
	var $ID : Integer
	
	Super("Dossiers"; Null; 27)
	
	$ID:=$IDentity
	This.ID:=$ID
	
	// récupérer les données du dossier
	Begin SQL
		SELECT volume FROM Dossiers WHERE id = :$ID INTO :varInteger2;
	End SQL
	This.volume:=varInteger2
    

[class]Personnes - 17/10/2025 09:43:40

      // attributs de la classe
property nom; prenom; autres_prenoms; metier; commentaire : Text
property sexe : Boolean

Class extends _SQLentite

Class constructor($IDentity : Variant)
	// initialiser l'objet avec les données de l'entité $IDunique de la BDD
	var $UUID : Text
	
	Super("Personnes"; $IDentity; 1)
	
	// récupérer les données de la personne
	$UUID:=This.IDunique
	This.InitVarProcessSQL()
	
	Try
		Begin SQL
			SELECT nom, prenom, autres_prenoms, sexe , metier, commentaire FROM Personnes WHERE IDunique = :$UUID INTO :varText1, :varText2, :varText3, :varBool, :varText4, :varText5;
		End SQL
		
	Catch
		// la table n'existe pas (test des composants)
		varText1:="Sacquet"
		varText2:="Bilbon"
		varText3:="Le Hobbit"
		varBool:=False
		varText4:="aventurier"
		varText5:="héros des 'seigneurs des anneaux'"
	End try
	
	// enregistrer ce qu'on a trouvé (ou les valeurs par défaut)
	This.nom:=varText1
	This.prenom:=varText2
	This.autres_prenoms:=varText3
	This.sexe:=varBool
	This.metier:=varText4
	This.commentaire:=varText5
	
	// rappel : dans le constructeur on ne peut pas appeler une function
	
	
Function Libellé($formats : Object)->$libellé : Text
	// renvoie le nom formaté suivant les options $formats
	var $options : Integer
	
	$options:=$formats.Options
	
	$libellé:=""
	$libellé:=(This.prenom)*Num($options ?? 1)  //  bit 1 = ajouter le prénom
	$libellé:=$libellé+(Num($options ?? 2)*Num(This.autres_prenoms#"")*(" "+This.autres_prenoms))  //  bit 2 = ajouter les autres prénoms
	
	If ($options ?? 3)  // d'abord le prénom
		$libellé:=$libellé+((" "*Num($options ?? 1))+This.nom)*Num($options ?? 0)  //  bit 0 = ajouter le nom
	Else 
		$libellé:=(This.nom+(" "*Num($options ?? 1)))*Num($options ?? 0)+$libellé  //  bit 0 = ajouter le nom
	End if 
	$libellé:=(This.LireLocatedSTR(1013)*Num($options ?? 5))+$libellé  // bit 5 =  conjoint
	
	
	// ----------------------
	//MARK:Sélection
	// ----------------------
	
Function LesEvents()->$result : Collection
	// récupérer les events perso
	var $ID : Integer
	
	// attention il peut ne pas y en avoir
	ARRAY LONGINT($tabID; 0)
	Try
		$ID:=This.ID
		Begin SQL
			SELECT Events.ID FROM Events
			INNER JOIN EventsPerso ON Events.ID = EventsPerso.evenement
			WHERE  EventsPerso.personne = :$ID
			ORDER BY Events.dateNum ASC
			INTO :$tabID;
		End SQL
		
	Catch
		APPEND TO ARRAY($tabID; -1)
	End try
	
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
	
Function LesParents()->$result : Integer
	var $ID : Integer
	
	// lire le ID de l'union parentale
	$ID:=This.ID
	This.InitVarProcessSQL()
	
	Try
		Begin SQL
			SELECT parents FROM Personnes WHERE ID = :$ID INTO :varInteger1;
		End SQL
		
	Catch
		// la table n'existe pas (test des composants)
		varInteger1:=-2
	End try
	
	// les parents peuvent ne pas exister
	$result:=varInteger1*Num(varInteger1>0)
	
	
Function LesUnions()->$result : Collection
	// créer la collection des unions triées par date
	var $ID : Integer
	
	$ID:=This.ID
	// attention il peut ne pas y en avoir
	ARRAY LONGINT($tabID; 0)
	Begin SQL
		SELECT ID FROM Unions
		WHERE Unions.couple IN
		(SELECT groupe FROM Relations
		INNER JOIN Personnes ON Personnes.ID = Relations.membre
		WHERE  Personnes.ID = :$ID)
		INTO :$tabID;
	End SQL
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
	
Function LesMediasDeTypeZone($type : Integer)->$result : Collection
	// sélectionner les events de la personne, les events familiaux, concatainer
	// puis sélectionner les medias
	var $ID; $typeSQL : Integer
	
	$typeSQL:=$type
	$ID:=This.ID
	ARRAY LONGINT($tabID; 0)
	
	Try
		If ($type>0)
			
			Begin SQL
				SELECT media
				FROM Zones
				WHERE Zones.ID IN
				(SELECT Personnages.zone FROM Personnages WHERE Personnages.personne = :$ID) AND type = :$typeSQL
				INTO :$tabID; 
			End SQL
			
		Else 
			
			Begin SQL
				SELECT media
				FROM Zones
				WHERE Zones.ID IN
				(SELECT Personnages.zone FROM Personnages WHERE Personnages.personne = :$ID)
				INTO : $tabID; 
			End SQL
			
		End if 
		
	Catch
		APPEND TO ARRAY($tabID; -1)
	End try
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
	
Function LesMedias()->$result : Collection
	// chercher les medias à afficher de la personne
	var $ID : Integer
	
	// sélectionner les events de la personne, les events familiaux, concatainer
	// puis sélectionner les medias
	$ID:=This.ID
	ARRAY LONGINT(tabID; 0)
	ARRAY LONGINT(tabEvents; 0)
	ARRAY LONGINT($tabID; 0)
	
	Try
		Begin SQL
			SELECT DISTINCT EventsPerso.evenement
			FROM EventsPerso
			INNER JOIN Personnes ON EventsPerso.personne = Personnes.ID
			WHERE Personnes.ID = :$ID
			INTO :tabID;
			
			SELECT EventsFam.evenement
			FROM Relations
			LEFT OUTER JOIN (Unions LEFT OUTER JOIN EventsFam ON Unions.ID = EventsFam.famille)
			ON Relations.groupe = Unions.couple
			WHERE  Relations.membre = :$ID
			INTO :tabEvents;
			
			SELECT ID
			FROM Events
			WHERE ({fn EstDansTableauNumeric('tabID',ID) AS NUMERIC} > -1 OR {fn EstDansTableauNumeric('tabEvents',ID) AS NUMERIC} > -1) AND type > 20000 AND type < 39999
			INTO :tabID;
			
			SELECT DISTINCT Zones.media
			FROM Zones
			INNER JOIN Instantanes ON Zones.ID = Instantanes.zone
			WHERE {fn EstDansTableauNumeric('tabID',Instantanes.event) AS NUMERIC} > -1
			INTO :tabID;
			
			SELECT DISTINCT ID
			FROM Medias
			WHERE {fn EstDansTableauNumeric('tabID',ID) AS NUMERIC} > -1
			ORDER BY dateNum ASC, heure ASC
			INTO :$tabID;
		End SQL
		
	Catch
		APPEND TO ARRAY($tabID; -1)
	End try
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
	
    

[class]SitesSelect - 28/09/2025 18:54:42

      Class extends _SQLentiteSelect

Class constructor($requête : Variant)
	
	Super("Sites"; $requête; 12)
	
	
    

[class]UnionsSelect - 25/08/2025 08:11:55

      Class extends _SQLentiteSelect

Class constructor($requête : Variant)
	
	Super("Unions"; $requête; 5)
	
	
Function Chercher($params : Object)
	var $nom; $prenom : Text
	var $sexe : Boolean
	
	$nom:=""
	$prenom:=""
	This._ValiderSaisie($params; ->$nom; ->$prenom)
	
	// retyper le sexe 
	$sexe:=(Num($params.sexe)=1)
	
	ARRAY LONGINT($tabID; 0)
	Begin SQL
		SELECT  Unions.ID FROM Unions
		INNER JOIN Relations ON Relations.groupe=Unions.couple
		WHERE Relations.membre IN
		
		(SELECT Personnes.ID FROM Personnes
		WHERE nom LIKE :$nom AND prenom LIKE :$prenom AND sexe = :$sexe)
		
		INTO :$tabID
	End SQL
	
	ARRAY TO COLLECTION(This.collection; $tabID)
	
	// il peut y avoir la valeur 0 (un NULL quelque part?)
	This.collection:=This.collection.filter(Formula($1.value>$2); 0)
	
    

[class]DepartementsSelect - 25/06/2024 10:09:38

      Class extends _SQLentiteSelect

Class constructor($requête : Variant)
	
	Super("Departements"; $requête; 14)
	
    

[class]Events - 25/09/2025 09:17:28

      // attributs de la classe
property type : Integer
property dateChaine; commentaire; source : Text
property dateNum : Date
property heure : Time
property leLieu : cs.Lieux

Class extends _SQLentite

Class constructor($IDentity : Variant)
	// initialiser l'objet avec les données de l'entité $IDunique de la BDD
	// rappel : l'event est genré dynamiquement (voir le getEvent() de la classe Personne)
	var $ID : Integer
	
	Super("Events"; $IDentity; 9)
	
	// lire les données de l'event
	$ID:=This.ID
	This.InitVarProcessSQL()
	
	Try
		Begin SQL
			SELECT type, dateChaine, dateNum, heure, commentaire, source, lieu FROM Events WHERE ID = :$ID INTO :varInteger2, :varText1, :varDate, :varTime, :varText2, :varText3, :varInteger1;
		End SQL
		
	Catch
		// la table n'existe pas (test des composants)
		varText1:="23 septembre 1956"
		varInteger2:=22000
		varDate:=Current date
		varTime:=Time("16:00:00")
		varText2:="Commentaire de l'évènement "+String(varInteger2)
		varText3:="Source Event"
		varInteger1:=-2
	End try
	
	// enregistrer ce qu'on a trouvé (ou les valeurs par défaut)
	This.type:=varInteger2
	This.dateChaine:=varText1
	This.dateNum:=varDate
	This.heure:=varTime
	This.commentaire:=varText2
	This.source:=varText3
	
	This.leLieu:=cs.Lieux.new(varInteger1)
	
	
Function Libellé($formats : Object)->$libellé : Text
	var $options : Integer
	var $sélection : Collection
	
	$options:=$formats.Options
	
	$libellé:=""
	If ($options ?? 12)
		If ($options ?? 13)  // & (This.estEventPersonnel()))
			$libellé:=This.LireLocatedSTR(Int(This.type/100)%100+1000; New object("genre"; $formats.genre; "plur"; False))
		Else 
			$libellé:=This.LireLocatedSTR(This.type)
			If ($options ?? 24)
				$libellé[[1]]:=Lowercase($libellé[[1]])
				$libellé:=This.LireLocatedSTR(Int(This.type/100)%100+1100)+$libellé
			End if 
		End if 
	End if 
	
	If ($options ?? 20)
		$libellé:=Localized string(String(16000000+This.type))+" "
	End if 
	
	If ($options ?? 10)
		$libellé:=$libellé+This.FormaterDate($formats)
	End if 
	
	If ($options ?? 14)
		$libellé:=$libellé+This.FormaterHeure($formats)
	End if 
	
	If (($options ?? 11) & (This.leLieu.ID>0))
		// créer la sélection commune
		$libellé:=$libellé+($formats.SymbolDateLieu*Num(Not($options ?? 9)))+This.leLieu.Le("Communes").Libellé($formats)
	End if 
	
	If ($options ?? 15)
		$sélection:=This._LesProtagonistes()
		$formats.Options:=$formats.Options ?+ 0
		$formats.Options:=$formats.Options ?+ 1
		Case of 
			: ($sélection.length=1)
				// un event de personne
				$libellé:=$libellé+This.LireLocatedSTR(1001)+$sélection[0].Libellé($formats)
				
			: ($sélection.length=2)
				// un event de famille
				$libellé:=$libellé+This.LireLocatedSTR(1001)+This.Libellés($sélection; $formats).result
		End case 
	End if 
	
	
Function FormaterDate($formats : Object)->$result : Text
	// code dateNum dans le format $Formats avec les options $3.Options
	// $formats :
	// .FormatDate
	// .FormatHeure
	// .Options:
	//.  bit 8 = entête
	
	var $texte; $date; $jour; $mois; $année; $nomDuMois; $nomMois : Text
	var $options; $i : Integer
	var $dateValide : Boolean
	
	$options:=$Formats.Options
	
	$texte:=""
	
	$date:=This.dateChaine
	//le séparateur d'items de date est " "
	$jour:=Substring($date; 1; Position(" "; $date; *)-1)
	$date:=Delete string($date; 1; Position(" "; $date; *))
	$nomDuMois:=Substring($date; 1; Position(" "; $date; *)-1)
	$date:=Delete string($date; 1; Position(" "; $date; *))
	$année:=Substring($date; 1; 4)
	$mois:="01"
	$dateValide:=False
	For ($i; 12; 1; -1)
		$nomMois:=String(Add to date(!1999-12-01!; 0; $i; 0); Internal date long)
		$nomMois:=Substring($nomMois; Position(" "; $nomMois; *)+1)
		$nomMois:=Substring($nomMois; 1; Position(" "; $nomMois; *)-1)  // nom du mois $1 dans la langue courante
		If ($nomDuMois=$nomMois)
			$mois:=String($i)
			$dateValide:=True
			$i:=0
		End if 
	End for 
	
	If (Num($année)=0)
		$année:="100"
		$dateValide:=False
	End if 
	
	If (Num($jour)=0)  //dernier jour du mois $mois
		$jour:=String(Day of(Add to date(Add to date(!00-00-00!; Num($année); Num($mois)+1; 1); 0; 0; -1)))
		$dateValide:=False
	End if 
	
	// mettre au format demandé
	Case of 
		: ($Formats.FormatDate=0)  // la date de la BDD au format numérique
			$formats.dateValide:=$dateValide
			$formats.dateNum:=Add to date(!00-00-00!; Num($année); Num($mois); Num($jour))
			
		: ($Formats.FormatDate=Internal date long)  // la date mémorisée en la BDD
			$texte:=Choose(($options ?? 8) & $dateValide; This.LireLocatedSTR(1008); " ")+This.dateChaine
			
		: ($Formats.FormatDate=Internal date short)  // la date de la BDD si possible au format numérique 7 = "jj-mm-aaaa"
			Case of 
				: ($dateValide)
					$texte:=(This.LireLocatedSTR(1008)*Num($options ?? 8))+$jour+"-"+$mois+"-"+$année
					
				: (This.dateChaine="")
					$texte:=This.LireLocatedSTR(1004)  // inconnu
					
				Else 
					$texte:=(" "*Num($options ?? 8))+This.dateChaine
			End case 
			
		: ($Formats.FormatDate=11)  // la date de la BDD au format numérique = "aaaa"
			$texte:=$année
			
	End case 
	$result:=$texte
	
	
Function FormaterHeure($formats : Object)->$result : Text
	// code heure dans le format $Formats avec les options $3.Options
	// $formats :
	// .FormatHeure
	// .Options:
	//   bit 8 = entête
	var $options : Integer
	var $texte : Text
	
	$options:=$Formats.Options
	
	$texte:=String(Time(This.heure); Num($Formats.FormatHeure))
	$texte:=Replace string($texte; ":"; "h"; *)
	$texte:=(This.LireLocatedSTR(33)*Num($options ?? 8))+$texte
	$result:=$texte*Num(Not(Time(This.heure)=?00:00:00?))
	
	
Function Libellés($sélection : Collection; $formats : Object)->$data : Object
	// renvoie les noms formatés de la sélection courante, suivant les paramètres $formats
	// $formats :
	// .Options
	//    (cf class Personnes)
	//   bit  4 = lier un conjoint
	//   bit  6 = d'abord le conjoint ???
	// .SymbolConjoints
	var $entité : Object
	
	// trier homme / femme
	// remarque : si on a un élément vide, le tri le passe en second 
	$sélection:=$sélection.orderBy("sexe "+Choose($formats.Options ?? 6; "desc"; "asc"))
	// fixer le retour
	$data:=New object("Membre1"; ""; "Membre2"; ""; "result"; "")
	// pour coder les noms des membres, il faut passer par une entité de personne
	For each ($entité; $sélection)
		Case of 
			: ($data.Membre1="")
				$data.Membre1:=$entité.Libellé($formats)
			: ($data.Membre2="")
				$data.Membre2:=$entité.Libellé($formats)
		End case 
	End for each 
	
	Case of 
		: ($data.Membre2=Null)
		: ($data.Membre2="")
		Else 
			// bit 4 = renvoyer le conjoint lié
			If ($formats.Options ?? 4)
				$data.Membre2:=$formats.SymbolConjoints+($data.Membre2)
			End if 
			// les conjoints liés
			$data.result:=($data.Membre1)+$formats.SymbolConjoints+($data.Membre2)
	End case 
	
	
Function _LesProtagonistes()->$result : Collection
	var $c : Collection
	var $PersonnesSelect : cs.PersonnesSelect
	
	$c:=This.LesProtagonistes()
	$PersonnesSelect:=cs.PersonnesSelect.new($c)
	$result:=$PersonnesSelect.Créer().selection
	
	
	// ----------------------
	//MARK:Sélection
	// ----------------------
	
Function parent()->$result : Object
	// chercher le parent de this
	var $ID; $i : Integer
	
	$result:=Null
	
	If (This.ID>0)
		$ID:=This.ID
		If (This.type<29999)
			// la personne de l'event perso
			Begin SQL
				SELECT personne FROM EventsPerso WHERE evenement = :$ID INTO :$i;
			End SQL
			$result:=cs.Personnes.new($i)
			
		Else 
			Begin SQL
				SELECT EventsFam.famille FROM EventsFam WHERE EventsFam.evenement = :$ID INTO :$i;
			End SQL
			$result:=cs.Unions.new($i)
		End if 
	End if 
	
	
Function LesProtagonistes()->$result : Collection
	var $ID : Integer
	
	$result:=New collection
	
	$ID:=This.ID
	ARRAY LONGINT($tabID; 0)
	
	Try
		If (This.type<29999)
			// la personne de l'event perso
			Begin SQL
				SELECT personne FROM EventsPerso WHERE evenement = :$ID INTO :$tabID;
			End SQL
			
		Else 
			// les conjoints de l'event fam
			Begin SQL
				SELECT Relations.membre
				FROM EventsFam
				LEFT OUTER JOIN (Unions LEFT OUTER JOIN Relations ON Unions.couple = Relations.groupe)
				ON EventsFam.famille = Unions.ID
				WHERE EventsFam.evenement = :$ID
				INTO :$tabID;
			End SQL
		End if 
		
	Catch
		APPEND TO ARRAY($tabID; -1)
	End try
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
	
Function LesTémoins($groupe : Text)->$result : Collection
	var $entité : Object
	
	$entité:=This.getEventType()
	$result:=$entité.LesTémoins($groupe)
	
	
Function getEventType()->$result : Object
	var $ID; $i : Integer
	
	$result:=Null
	
	// essayer un type Perso
	$ID:=This.ID
	$i:=-1
	Begin SQL
		SELECT EventsPerso.evenement
		FROM EventsPerso 
		WHERE EventsPerso.evenement = :$ID
		INTO :$i;
	End SQL
	
	If ($i>0)
		$result:=cs.EventsPerso.new($ID)
		
	Else 
		// essayer un type Fam
		$i:=-1
		Begin SQL
			SELECT EventsFam.evenement
			FROM EventsFam 
			WHERE EventsFam.evenement = :$ID
			INTO :$i;
		End SQL
		
		If ($i>0)
			$result:=cs.EventsFam.new($ID)
		End if 
	End if 
	
	
Function estEventPersonnel()->$result : Boolean
	$result:=(This.getEventType().DataClassNom="EventsPerso")
	
	
	
    

[class]MediasSelect - 03/06/2024 11:37:39

      Class extends _SQLentiteSelect

Class constructor($requête : Variant)
	
	Super("Medias"; $requête; 19)
	
	
    

[class]Pays - 29/05/2025 14:55:11

      // attributs de la classe
property nom : Text
property drapeau : Picture
property latitude; longitude : Real

Class extends _SQLentite

Class constructor($IDentity : Variant)
	// initialiser l'objet avec les données de l'entité $IDunique de la BDD
	var $ID : Integer
	
	Super("Pays"; $IDentity; 16)
	
	$ID:=This.ID
	This.InitVarProcessSQL()
	
	Try
		Begin SQL
			SELECT  nom, drapeau, latitude, longitude FROM Pays WHERE Pays.ID = :$ID INTO :varText1,  :varPicture1,  :varReal1, :varReal2;
		End SQL
		
	Catch
		// la table n'existe pas (test des composants)
		varText1:="Terres du Milieu"
		READ PICTURE FILE(Folder(fk resources folder).folder("Images").file("19200.png").platformPath; varPicture1)
		varReal1:=45.3
		varReal2:=0.3
	End try
	
	// enregistrer ce qu'on a trouvé (ou les valeurs par défaut)
	This.nom:=varText1
	This.drapeau:=varPicture1
	This.latitude:=varReal1
	This.longitude:=varReal2
	
	
Function Libellé($formats : Object)->$libellé : Text
	// renvoie le nom formaté suivant les options $1
	// function identique à celle de la BDDmère
	//  pas d'options
	$libellé:=This.nom
	
	
	// ----------------------
	//MARK:Sélections
	// -----------------------
	
Function Le($DataClassNom : Text)->$result : Object
	// renvoie l'entité [$DataClassNom]
	If ($DataClassNom=This.DataClassNom)
		$result:=This
	End if 
	
	
Function LesDepartements()->$result : Collection
	// renvoie la collection de tous les départements de this
	var $ID : Integer
	
	$ID:=This.ID
	ARRAY LONGINT($tabID; 0)
	Begin SQL
		SELECT Departements.ID From Departements INNER JOIN Regions ON Departements.region=Regions.ID WHERE Regions.pays = :$ID INTO :$tabID;
	End SQL
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
    

[class]_SQLentiteSelect - 19/09/2025 14:59:49

      property DataClassNom : Text
property numTable : Integer
property collection : Collection

Class extends _SQL_DataStore

Class constructor($DataClassNom : Text; $request : Variant; $numTable : Integer)
	var $texte : Text
	
	Super()
	
	This.DataClassNom:=$DataClassNom
	This.numTable:=$numTable
	This.collection:=New collection
	
	
	// construire la collection de ID suivant la requête
	Case of 
		: ($request=Null)
			
		: (Value type($request)=Is text)
			// $request est la clause 'where' de la requête SQL
			// créer la requête
			$texte:="SELECT ID FROM "+This.DataClassNom+" WHERE "+$request+" INTO :tabID;"
			
			ARRAY LONGINT(tabID; 0)
			Try
				Begin SQL
					EXECUTE IMMEDIATE :$texte;
				End SQL
				
			Catch
				APPEND TO ARRAY(tabID; -1)
				APPEND TO ARRAY(tabID; -2)
				APPEND TO ARRAY(tabID; -3)
			End try
			
			ARRAY TO COLLECTION(This.collection; tabID)
			
			
		: (Value type($request)=Is collection)
			// $request est une collection d'ID
			This.collection:=$request
	End case 
	
	
Function Créer()->$result : Object
	// renvoyer la collection des entités de .collection
	$result:=New object
	$result.DataClassNom:=This.DataClassNom
	
	$result.selection:=This.setEntités(This.DataClassNom; This.collection)
	$result.length:=This.collection.length
	
	
Function FiltrerSurID($filtre : Collection)
	// attention, pas forcément appelé dans le composant
	var $c : Collection
	
	$c:=This.collection.filter(Formula($2.indexOf($1.value)>-1); $filtre)
	This.collection:=$c
	
	
Function _ValiderSaisie($params : Object; $nom : Pointer; $prenom : Pointer)
	// rappel : les commandes SQL sont diacritiques
	var $c; $cc : Collection
	var $texte : Text
	
	$nom->:=""
	$prenom->:=""
	
	// les noms sont stockés en majuscule
	If (OB Is defined($params; "Nom"))
		$nom->:=Uppercase($params.Nom; *)
		$nom->:=Replace string($nom->; "@"; "")+"%"
	End if 
	
	// le prénom (peut être vide)
	If (OB Is defined($params; "Prenom"))
		$prenom->:=$params.Prenom
		// les prénoms sont stockés avec la première lettre en majuscule
		$c:=Split string($prenom->; "-")
		$cc:=New collection
		For each ($texte; $c)
			$texte[[1]]:=Uppercase($texte[[1]])
			$cc.push($texte)
		End for each 
		$prenom->:=$cc.join("-")
		
		$prenom->:=Replace string($prenom->; "@"; "")+"%"
	End if 
	
	
    

[class]CommunesSelect - 29/08/2025 10:20:27

      Class extends _SQLentiteSelect

Class constructor($request : Variant)
	
	Super("Communes"; $request; 13)
	
	
Function Chercher($params : Object)->$result : cs.CommunesSelect
	var $nomCommune : Text:=""
	
	This._ValiderSaisie($params; ->$nomCommune)
	
	ARRAY LONGINT($tabID; 0)
	Begin SQL
		SELECT ID FROM Communes WHERE nom Like :$nomCommune INTO :$tabID;
	End SQL
	
	ARRAY TO COLLECTION(This.collection; $tabID)
	
	// pour le chainage des functions
	$result:=This
	
	
Function _ValiderSaisie($params : Object; $nomCommune : Pointer)
	
	If (OB Is defined($params; "Nom"))
		$nomCommune->:=OB Get($params; "Nom"; Is text)
		$nomCommune->[[1]]:=Uppercase($nomCommune->[[1]]; *)
		$nomCommune->:=Replace string($nomCommune->; "@"; "")+"%"
	End if 
	
	
Function CollecterNomsSurID()->$result : Collection
	
	ARRAY LONGINT(tabID; 0)
	COLLECTION TO ARRAY(This.collection; tabID)
	
	ARRAY TEXT($tabNom; 0)
	Begin SQL
		SELECT DISTINCT nom FROM Communes WHERE {fn EstDansTableauNumeric('tabID',Communes.ID) AS NUMERIC} > -1 INTO :$tabNom;
	End SQL
	
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabNom)
	
	
Function LesEvents()->$result : Collection
	var $ID : Integer
	var $c : Collection
	
	$result:=New collection
	
	For each ($ID; This.collection)
		$c:=cs.Communes.new($ID).LesEvents()
		$result:=$result.combine($c)
	End for each 
	
    

[class]Communes - 03/10/2025 18:25:37

      // attributs de la classe
property nom : Text
property blason : Picture
property leDepartement : cs.Departements

Class extends _SQLentite

Class constructor($IDentity : Variant)
	// initialiser l'objet avec les données de l'entité $IDunique de la BDD
	var $ID : Integer
	
	Super("Communes"; $IDentity; 13)
	
	$ID:=This.ID
	This.InitVarProcessSQL()
	
	Try
		Begin SQL
			SELECT  nom, blason, departement FROM Communes WHERE Communes.ID = :$ID INTO :varText1, :varPicture1, :varInteger1;
		End SQL
		
	Catch
		// la table n'existe pas (test des composants)
		varText1:="MinasTirith"
		READ PICTURE FILE(Folder(fk resources folder).folder("Images").file("19200.png").platformPath; varPicture1)
		varInteger1:=-2
	End try
	
	// enregistrer ce qu'on a trouvé (ou les valeurs par défaut)
	This.nom:=varText1
	This.blason:=varPicture1
	
	// reconstituer la hiérarchie administrative : département, région et pays de la commune
	// le département
	This.leDepartement:=cs.Departements.new(varInteger1)
	
	
Function Libellé($formats : Object)->$libellé : Text
	// renvoie le nom formaté suivant les options $formats
	// function identique à celle de la BDDmère
	// $formats
	// .Options 
	//   bit  9 = entête lieu   :" à "(sinon le symbole séparationDateLieu)
	//   bit 16 = ajouter le n° de département à la commune
	var $texte : Text
	
	$libellé:=""
	
	Case of 
		: (This=Null)
		: (This.nom="")
		Else 
			$libellé:=Localized string("1012")*Num($formats.Options ?? 9)
			$libellé:=$libellé+(("("+String(This.leDepartement.numero)+") ")*Num($formats.Options ?? 16)*Num(This.leDepartement.numero#0))
			$libellé:=$libellé+This.nom
			// la suite, au besoin
			$texte:=This.leDepartement.Libellé($formats)
			$libellé:=$libellé+((" - "+$texte)*Num(Length($texte)>0))
	End case 
	
	
	// ----------------------
	//MARK:Sélection
	// ----------------------
	
Function LesEvents()->$result : Collection
	// créer la collection des events liés à la commune
	var $ID : Integer
	
	$ID:=This.ID
	ARRAY LONGINT($tabID; 0)
	
	Try
		Begin SQL
			SELECT Events.ID FROM Events WHERE Events.lieu IN
			(SELECT T1.ID FROM Lieux AS T1 LEFT OUTER JOIN Sites as T2 ON T1.site = T2.ID WHERE T2.commune = :$ID)
			ORDER BY Events.dateNum ASC
			INTO :$tabID;
		End SQL
		
	Catch
		APPEND TO ARRAY($tabID; -1)
	End try
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
	
Function LesSites()->$result : Collection
	var $ID : Integer
	
	$ID:=This.ID
	ARRAY LONGINT($tabID; 0)
	
	Try
		Begin SQL
			SELECT DISTINCT Sites.ID
			FROM Sites
			WHERE Sites.commune = :$ID
			INTO :$tabID;
		End SQL
		
	Catch
		APPEND TO ARRAY($tabID; -1)
		APPEND TO ARRAY($tabID; -2)
	End try
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
	
Function LesLieux()->$result : Collection
	// créer la collection des lieux de la commune
	var $ID : Integer
	
	$ID:=This.ID
	ARRAY LONGINT($tabID; 0)
	
	Try
		Begin SQL
			SELECT Lieux.ID
			FROM Lieux
			WHERE Lieux.site IN
			(
			SELECT DISTINCT Sites.ID
			FROM Sites
			INNER JOIN Communes ON Sites.commune = Communes.ID
			WHERE Communes.ID = :$ID
			)
			INTO :$tabID;
		End SQL
		
	Catch
		APPEND TO ARRAY($tabID; -1)
	End try
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
	
Function LesMedias()->$result : Collection
	// créer la collection des medias de la commune
	var $ID : Integer
	
	$ID:=This.ID
	ARRAY LONGINT($tabID; 0)
	
	Try
		Begin SQL
			SELECT Paysages.zone
			FROM Sites
			LEFT OUTER JOIN (Paysages LEFT OUTER JOIN Lieux ON Paysages.lieu = Lieux.ID)
			ON Sites.ID = Lieux.site
			WHERE  Sites.commune = :$ID
			INTO :tabID;
			
			SELECT media FROM Zones
			WHERE {fn EstDansTableauNumeric('tabID',Zones.ID) AS NUMERIC} > -1
			INTO :tabID;
			
			SELECT DISTINCT ID
			FROM Medias
			WHERE {fn EstDansTableauNumeric('tabID',ID) AS NUMERIC} > -1 
			ORDER BY dateNum ASC, heure ASC
			INTO :$tabID;
		End SQL
		
	Catch
		APPEND TO ARRAY($tabID; -1)
	End try
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
	
Function Le($DataClassNom : Text)->$result : Object
	// renvoie l'entité [$DataClassNom]
	If ($DataClassNom=This.DataClassNom)
		$result:=This
	Else 
		$result:=This.leDepartement.Le($DataClassNom)
	End if 
	
	
Function LieuParDefaut()->$result : Integer
	// trouver son lieu de type 60700 (existe toujours)
	var $ID : Integer
	
	Try
		$ID:=This.ID
		ARRAY LONGINT($tabID; 0)
		Begin SQL
			SELECT Lieux.ID
			FROM Lieux
			WHERE Lieux.type = 60700 AND Lieux.site IN
			(
			SELECT DISTINCT Sites.ID
			FROM Sites
			INNER JOIN Communes ON Sites.commune = Communes.ID
			WHERE Communes.ID = :$ID
			)
			INTO :$tabID;
		End SQL
		
	Catch
		APPEND TO ARRAY($tabID; -1)
	End try
	
	$result:=-1
	// renvoyer le premier ID
	If (Size of array($tabID)>0)
		$result:=$tabID{1}
	End if 
	
    

[class]LieuxSelect - 29/09/2025 10:32:57

      Class extends _SQLentiteSelect

Class constructor($requête : Variant)
	
	Super("Lieux"; $requête; 10)
	
	
    

[class]PaysSelect - 03/08/2024 13:47:48

      Class extends _SQLentiteSelect

Class constructor($requête : Variant)
	
	Super("Pays"; $requête; 16)
	
	
Function CollecterTousLesPays()
	
	ARRAY LONGINT($tabID; 0)
	Begin SQL
		SELECT ID FROM Pays ORDER BY nom INTO :$tabID;
	End SQL
	
	// renvoyer la collection d'ID
	This.collection:=New collection
	ARRAY TO COLLECTION(This.collection; $tabID)
	
    

[class]Lieux - 29/09/2025 10:52:16

      // attributs de la classe
property type : Integer
property nom; commentaire : Text
property latitude; longitude : Real
property leSite : cs.Sites

Class extends _SQLentite

Class constructor($IDentity : Variant)
	// initialiser l'objet avec les données de l'entité $IDunique de la BDD
	var $ID : Integer
	
	Super("Lieux"; $IDentity; 10)
	
	// lire les données du lieu
	$ID:=This.ID
	This.InitVarProcessSQL()
	
	Try
		Begin SQL
			SELECT  type, nom, site, latitude, longitude, commentaire FROM Lieux WHERE Lieux.ID = :$ID INTO :varInteger2, :varText1, :varInteger1, :varReal1, :varReal2, :varText2;
		End SQL
		
	Catch
		// la table n'existe pas (test des composants)
		varText1:="Tour d'Ecthélion"
		varInteger2:=60300
		varInteger1:=-2
		varText2:="Commentaire du lieu "+String(varInteger2)
	End try
	
	// enregistrer ce qu'on a trouvé (ou les valeurs par défaut)
	This.type:=varInteger2
	This.nom:=varText1
	This.latitude:=varReal1
	This.longitude:=varReal2
	This.commentaire:=varText2
	
	// reconstituer la hiérarchie administrative : site, commune, département, région et pays du lieu
	// le site
	This.leSite:=cs.Sites.new(varInteger1)
	
	
Function Créer()->$result : Object
	$result:=This
	
	
Function Libellé($formats : Object)->$libellé : Text
	// renvoie le nom formaté suivant les options $formats
	// function identique à celle de la BDDmère
	// $formats
	// .Options 
	// bit 17 = ajouter la commune
	// bit 18 = ajouter le site
	var $texte : Text
	
	$libellé:=""
	
	Case of 
		: (This=Null)
		: (This.nom="")
		Else 
			$libellé:=This.nom
			$texte:=This.leSite.nom*Num(This.leSite#Null)
			$libellé:=$libellé+(Num(($formats.Options ?? 18) & ($texte#""))*(" ("+$texte+")"))
			$texte:=This.Le("Communes").Libellé($formats)
			$libellé:=$libellé+((Localized string("1015")+$texte)*Num(($formats.Options ?? 17) & ($texte#"")))
	End case 
	
	
	// ----------------------
	//MARK:Selection
	// ----------------------
	
Function Le($DataClassNom : Text)->$result : Object
	// renvoie l'entité [$DataClassNom]
	$result:=This.leSite.Le($DataClassNom)
	
	
Function LesLieux()->$result : Collection
	// créer la collection de this !
	$result:=New collection
	$result.push(This.ID)
	
	
Function LesEvents()->$result : Collection
	var $ID : Integer
	
	$ID:=This.ID
	ARRAY LONGINT($tabID; 0)
	
	Try
		Begin SQL
			SELECT Events.ID FROM Events WHERE Events.lieu = :$ID INTO :$tabID;
		End SQL
		
	Catch
		APPEND TO ARRAY($tabID; -1)
	End try
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
	//$result:=This.setEntités("Events"; ->$tabID)
	
	
Function LesMedias()->$result : Collection
	var $ID : Integer
	
	$ID:=This.ID
	ARRAY LONGINT($tabID; 0)
	Begin SQL
		SELECT Zones.media FROM Zones WHERE Zones.ID IN
		(SELECT zone FROM Paysages WHERE Paysages.lieu = :$ID)
		INTO :$tabID;
	End SQL
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
	//$result:=This.setEntités("Medias"; ->$tabID)
	
    

[class]Medias - 28/11/2025 13:59:04

      // attributs de la classe
property type; largeur; hauteur; private : Integer
property titre; dateChaine; Credits; nomFichier; commentaire : Text
property dateNum : Date
property dateNumValid : Boolean
property vignette : Picture

Class extends _SQLentite

Class constructor($IDentity : Variant)
	// initialiser l'objet avec les données de l'entité $IDentity de la BDD
	var $ID : Integer
	
	Super("Medias"; $IDentity; 19)
	
	// lire les données du media
	$ID:=This.ID
	This.InitVarProcessSQL()
	
	Try
		Begin SQL
			SELECT type, titre, dateChaine, dateNum, dateNumValid, largeur, hauteur, vignette, private, Credits, commentaire FROM Medias WHERE ID = :$ID INTO :varInteger1, :varText1, :varText2, :varDate, :varBool, :varInteger2, :varInteger3, :varPicture1, :varInteger4, :varText3, :varText4;
		End SQL
		
	Catch
		// la table n'existe pas (test des composants)
		varText1:="Vue générale de Trifouilly-lès-Oies"
		varText2:="20 septembre 2025"
		varDate:=Current date
		READ PICTURE FILE(Folder(fk resources folder).folder("Images").file("19200.png").platformPath; varPicture1)
		varText4:="Commentaire du media"
	End try
	
	// nom du fichier
	Try
		Begin SQL
			SELECT nom FROM Fichiers WHERE Fichiers.media = :$ID INTO :varText5;
		End SQL
		
	Catch
		// la table n'existe pas (test des composants)
		This.ID:=19200
		varText5:="19200.jpg"
	End try
	
	// enregistrer ce qu'on a trouvé (ou les valeurs par défaut)
	This.type:=varInteger1
	This.titre:=varText1
	This.dateChaine:=varText2
	This.dateNum:=varDate
	This.dateNumValid:=varBool
	This.largeur:=varInteger2
	This.hauteur:=varInteger3
	This.vignette:=varPicture1
	This.private:=varInteger4
	This.Credits:=varText3
	This.commentaire:=varText4
	
	This.nomFichier:=varText5
	
	
	
Function Libellé($formats : Object)->$libellé : Text
	// renvoie le nom formaté suivant les options $formats
	$libellé:=This.titre
	
	
	// ----------------------
	//MARK:Selection
	// ----------------------
	
Function LesPersonnes()->$result : Collection
	// rechercher les personnes zonées dans ce media
	// elles sont de gauche à droite
	var $ID; $i; $zone : Integer
	
	$ID:=This.ID
	ARRAY LONGINT($tabID; 0)
	
	Try
		// pas trouvé comment faire avec les functions SQL ; le trie se fait avec un tableau $tabZones intermédiaire pour conserver l'ordre
		ARRAY LONGINT(tabID; 0)
		ARRAY REAL($tabZones; 0)
		Begin SQL
			SELECT ID, gauche FROM Zones WHERE Zones.media = :$ID INTO :tabID, :$tabZones;
		End SQL
		
		SORT ARRAY($tabZones; tabID; >)
		
		For ($i; 1; Size of array(tabID))
			$zone:=tabID{$i}
			$ID:=-1
			Begin SQL
				SELECT personne FROM Personnages WHERE zone = :$zone INTO :$ID; 
			End SQL
			If ($ID>0)
				APPEND TO ARRAY($tabID; $ID)
			End if 
		End for 
		
		
	Catch
		APPEND TO ARRAY($tabID; -1)
	End try
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
	
Function LesEvents()->$result : Collection
	// rechercher les events zonés dans ce media
	var $ID : Integer
	
	$ID:=This.ID
	ARRAY LONGINT($tabID; 0)
	
	Try
		Begin SQL
			SELECT Instantanes.event FROM Instantanes WHERE zone IN
			(SELECT ID FROM Zones WHERE Zones.media = :$ID)
			INTO : $tabID; 
		End SQL
		
	Catch
		APPEND TO ARRAY($tabID; -1)
	End try
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
	
Function LesLieux()->$result : Collection
	// rechercher les lieux zonés dans ce media
	var $ID : Integer
	
	$ID:=This.ID
	ARRAY LONGINT($tabID; 0)
	
	Try
		Begin SQL
			SELECT Paysages.lieu FROM Paysages WHERE zone IN
			(SELECT ID FROM Zones WHERE Zones.media = :$ID)
			INTO : $tabID; 
		End SQL
		
	Catch
		APPEND TO ARRAY($tabID; -1)
	End try
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
	
Function LesMedias()->$result : Collection
	// rechercher les medias zonés dans ce media
	var $ID : Integer
	
	$ID:=This.ID
	ARRAY LONGINT($tabID; 0)
	
	Try
		Begin SQL
			SELECT Details.media FROM Details WHERE zone IN
			(SELECT ID FROM Zones WHERE Zones.media = :$ID)
			INTO : $tabID; 
		End SQL
		
	Catch
		APPEND TO ARRAY($tabID; -1)
	End try
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
    

[class]Departements - 29/05/2025 14:51:09

      // attributs de la classe
property nom : Text
property numero : Integer
property blason : Picture
property latitude; longitude : Real
property laRegion : cs.Regions

Class extends _SQLentite

Class constructor($IDentity : Variant)
	// initialiser l'objet avec les données de l'entité $IDunique de la BDD
	var $ID : Integer
	
	Super("Departements"; $IDentity; 14)
	
	$ID:=This.ID
	This.InitVarProcessSQL()
	
	Try
		Begin SQL
			SELECT  nom, numero, blason, region, latitude, longitude FROM Departements WHERE Departements.ID = :$ID INTO :varText1, :varInteger2, :varPicture1, :varInteger1, :varReal1, :varReal2;
		End SQL
		
	Catch
		varInteger1:=-2
		varText1:="Anorien"
		varInteger2:=7000
		READ PICTURE FILE(Folder(fk resources folder).folder("Images").file("19200.png").platformPath; varPicture1)
		varReal1:=45.1
		varReal2:=0.1
	End try
	
	// enregistrer ce qu'on a trouvé (ou les valeurs par défaut)
	This.nom:=varText1
	This.numero:=varInteger2
	This.blason:=varPicture1
	This.latitude:=varReal1
	This.longitude:=varReal2
	
	// reconstituer la hiérarchie administrative : région et pays du lieu du département
	// la région
	This.laRegion:=cs.Regions.new(varInteger1)
	
	
Function Libellé($formats : Object)->$libellé : Text
	// renvoie   (n° département) nom département - suite
	// function identique à celle de la BDDmère
	// suivant les options $1 :
	// $formats
	// .Options 
	//   bit 22 = département
	//   bit 24 = ajouter le n° de département au département
	var $texte : Text
	
	$libellé:=("("+String(This.numero)+") ")*Num((This.numero#0) & ($formats.Options ?? 24))
	$libellé:=($libellé+This.nom)*Num($formats.Options ?? 22)
	$texte:=This.laRegion.Libellé($formats)
	$libellé:=$libellé+((" - "+$texte)*Num((Length($texte)>0)))
	
	
	// ----------------------
	//MARK:Sélections
	// -----------------------
	
Function Le($DataClassNom : Text)->$result : Object
	// renvoie l'entité [$DataClassNom]
	If ($DataClassNom=This.DataClassNom)
		$result:=This
	Else 
		$result:=This.laRegion.Le($DataClassNom)
	End if 
	
	
Function LesCommunes()->$result : Collection
	var $ID : Integer
	
	$ID:=This.ID
	ARRAY LONGINT($tabID; 0)
	Begin SQL
		SELECT Communes.ID From Communes WHERE Communes.departement = :$ID INTO :$tabID;
	End SQL
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
	
    

[class]PersonnesSelect - 26/09/2025 18:06:24

      Class extends _SQLentiteSelect

Class constructor($requête : Variant)
	
	Super("Personnes"; $requête; 1)
	
	
	
	
Function Chercher($params : Object)->$result : cs.PersonnesSelect
	var $nom; $prenom : Text
	var $sexe1; $sexe2 : Boolean
	
	$nom:=""
	$prenom:=""
	This._ValiderSaisie($params; ->$nom; ->$prenom)
	
	// l'info sexe est optionnelle
	Case of 
		: (OB Is defined($params; "sexe"))
			// homme ou bien femme
			$sexe1:=($params.sexe="true")
			$sexe2:=($params.sexe="true")
		Else 
			// homme ou femme
			$sexe1:=True
			$sexe2:=False
	End case 
	
	ARRAY LONGINT($tabID; 0)
	Begin SQL
		SELECT ID FROM Personnes WHERE nom LIKE :$nom AND prenom LIKE :$prenom AND (sexe = :$sexe1 OR sexe = :$sexe2) INTO :$tabID;
	End SQL
	
	ARRAY TO COLLECTION(This.collection; $tabID)
	
	// il peut y avoir la valeur 0 (un NULL quelque part?)
	// ?????? This.collection:=This.collection.filter(Formula($1.value>$2); 0)
	
	// pour le chainage des functions
	$result:=This
	
	
Function CollecterNomsSurID()->$result : Collection
	
	ARRAY LONGINT(tabID; 0)
	COLLECTION TO ARRAY(This.collection; tabID)
	
	ARRAY TEXT($tabNom; 0)
	Begin SQL
		SELECT DISTINCT nom FROM Personnes WHERE {fn EstDansTableauNumeric('tabID',Personnes.ID) AS NUMERIC} > -1 INTO :$tabNom;
	End SQL
	
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabNom)
	
	
Function LesPatronymes()->$result : Collection
	// trouver tous les patronymes distincts de la sélection
	var $i : Integer
	var $patronyme : Text
	
	ARRAY LONGINT(tabID; 0)
	COLLECTION TO ARRAY(This.collection; tabID)
	
	ARRAY TEXT($tabNom; 0)
	
	Try
		Begin SQL
			SELECT DISTINCT patronyme FROM DicoDesNoms
			INNER JOIN Personnes ON DicoDesNoms.nom = Personnes.nom
			WHERE {fn EstDansTableauNumeric('tabID',Personnes.ID) AS NUMERIC} > -1
			INTO :$tabNom;
		End SQL
		
		// créer la collection des ID de $tabNom
		$result:=New collection
		For ($i; 1; Size of array($tabNom))
			$patronyme:=$tabNom{$i}
			
			ARRAY LONGINT($tabID; 0)
			Begin SQL
				SELECT ID FROM DicoDesNoms
				WHERE patronyme = :$patronyme
				INTO :$tabID;
			End SQL
			// par principe il y a plusieurs ID de même $patronyme ; on prend le premier
			$result.push($tabID{1})
		End for 
		
	Catch
		$result:=[-1]
	End try
	
	
    

[class]DicoDesNoms - 18/02/2026 11:33:26

      // attributs de la classe
property patronyme : Text
property lesNoms : Collection

Class extends _SQLentite

Class constructor($IDentity : Variant)
	// initialiser l'objet avec les données de l'entité $IDunique de la BDD
	var $ID : Integer
	var $patronyme : Text
	
	Super("DicoDesNoms"; $IDentity; 3)
	
	$ID:=This.ID
	This.InitVarProcessSQL()
	
	Try
		Begin SQL
			SELECT  patronyme FROM DicoDesNoms WHERE DicoDesNoms.ID = :$ID INTO :varText1;
		End SQL
		
	Catch
		// la table n'existe pas (test des composants)
		varText1:="Les Hobbits"
	End try
	
	// enregistrer ce qu'on a trouvé (ou les valeurs par défaut)
	This.patronyme:=varText1
	
	// retyper en texte
	$patronyme:=This.patronyme
	
	// lister les noms ayant le même patronyme
	Try
		ARRAY TEXT(tabNom; 0)
		Begin SQL
			SELECT DISTINCT nom FROM DicoDesNoms
			WHERE DicoDesNoms.patronyme = :$patronyme
			INTO :tabNom;
		End SQL
		
	Catch
		APPEND TO ARRAY(tabNom; $patronyme)
	End try
	
	This.lesNoms:=New collection
	ARRAY TO COLLECTION(This.lesNoms; tabNom)
	
	
Function Libellé($formats : Object)->$result : Text
	$result:=This.patronyme
	
	
	// ----------------------
	//MARK:Selection
	// ----------------------
	
Function LesPersonnes()->$result : Collection
	var $patronyme : Text
	
	$patronyme:=This.patronyme
	
	ARRAY LONGINT($tabID; 0)
	Begin SQL
		SELECT Personnes.ID FROM Personnes
		INNER JOIN DicoDesNoms ON DicoDesNoms.nom = Personnes.nom
		WHERE DicoDesNoms.patronyme = :$patronyme
		ORDER BY prenom ASC, autres_prenoms ASC
		INTO :$tabID;
	End SQL
	
	// renvoyer la collection d'ID
	$result:=New collection
	ARRAY TO COLLECTION($result; $tabID)
    

onStartup - 29/03/2025 17:21:31

      ON ERR CALL(Formula(traceHandler).source; ek global)

    

onExit - 01/04/2025 19:58:23

      // ne s'exécute pas dans une base hôte

// exporter le code du composant si pas compilé
ON ERR CALL(Formula(traceHandler).source; ek local)

cs.xSDK.ExportCode4D.new().DémarrerComposant()


    

onHostDatabaseEvent - 29/03/2025 17:21:31

      #DECLARE($numEvent : Integer)
// ici, s'exécute dans une base hôte

Case of 
	: ($numEvent=On before host database startup)
		
		ON ERR CALL(Formula(traceHandler).source; ek global)
		
		
	: ($numEvent=On after host database startup)
		// attention : le composant est exécuté dans une base hôte APP ou un autre composant (en debug)
		
		
	: ($numEvent=On after host database exit)
		
End case