4D Write pro Erreur en client serveur

4D Write pro V17.0
Fonctionne correctement en mono-poste mais erreur en client serveur.

Bonjour à tous,

Je créé des textes variés à partir d’une liste de modèles dont les références sont stockées dans des tableaux en fonction de la sélection de l’utilisateur.
Mes méthodes fonctionnaient parfaitement en mono-poste. Le problème est que j’obtiens un comportement différent en client-serveur : blocage lors de l’execution de <$plage:=WP Créer plage([Courrier]WP_Document)> “[Courrier]WP_Document n’est pas un document 4D Write pro”. Pourtant quand je trace mon document est bien là.

Je ne vois pas où est le problème.
d’avance merci pour votre aide.

Gilbert MENGEL

Exemple 1 :
Ici [Courrier]WP_Document est initialisé au chargement avec un document vierge préformaté

<code 4D>
// Créé un texte en fonction des éléments choisis
// Passé en en partie en notation objet le 20/09/18
// Modifié 23/09/18 pour insertion de modèles avec pieds de pages préformatés

C_OBJET($plage) // Objet plage
C_OBJET($docTempo) // Document temporaire
C_OBJET($selection) // Sélection d’entités
C_ENTIER LONG($i) // Compteur

b_Bol1:=Vrai
T_Info:=WP_Infos
$plage:=WP Créer plage([Courrier]WP_Document;wk start text;wk end text) // Prend tout le document comme plage

Boucle ($i;1;Taille tableau(as_w_Elements))

$selection:=ds.Modeles_textes.query("Type_ = :1 and Libelle = :2";as_w_Types_modeles{$i};as_w_Elements{$i})

Si ($selection.length>0)
	
	Si ($selection[0].Type_="Pied")
		
		  // Le document à insérer est un pied de pages
		  // On place tout le texte déjà créé dans une variable temporaire
		$docTempo:=WP Nouveau($plage)
		  // On créé un nouveau document vide avec le modèle choisi contenant le pied
		[Courrier]WP_Document:=$selection[0].WP_Corps
		  // On réinsère le texte temporaire
		$plage:=WP Créer plage([Courrier]WP_Document;wk start text;wk end text)
		WP INSÉRER DOCUMENT($plage;$docTempo;wk replace;wk include in range)
		
	Sinon 
		
		  // Le document à inserer est un corps de document
		  // Insère le modèle en fin de sélection et inclu l'ensemble à la sélection
		WP INSÉRER DOCUMENT($plage;$selection[0].WP_Corps;wk append;wk include in range)
		
	Fin de si 
	
Fin de si 

Fin de boucle

</code 4D>

Exemple 2 :
Ici on peut remplacer un pied de page préformaté par un autre. Je n’ai pas trouvé d’autre solution, pour commencer la numérotation en page 2, que de passer par des modèles préformatés.
Même blocage en client serveur lors de l’exécution WP Créer plage

<code 4D>
// Créé un texte en fonction des éléments choisis
// Passé en en partie en notation objet le 20/09/18
// Modifié 23/09/18 pour insertion de modèles avec pieds de pages préformatés

C_OBJET($plage) // Objet plage
C_OBJET($docTempo) // Document temporaire
C_OBJET($selection) // Sélection d’entités
C_ENTIER LONG($i) // Compteur

b_Bol1:=Vrai
T_Info:=WP_Infos
$plage:=WP Créer plage([Courrier]WP_Document;wk start text;wk end text) // Prend tout le document comme plage

Boucle ($i;1;Taille tableau(as_w_Elements))

$selection:=ds.Modeles_textes.query("Type_ = :1 and Libelle = :2";as_w_Types_modeles{$i};as_w_Elements{$i})

Si ($selection.length>0)
	
	Si ($selection[0].Type_="Pied")
		
		  // Le document à insérer est un pied de pages
		  // On place tout le texte déjà créé dans une variable temporaire
		$docTempo:=WP Nouveau($plage)
		  // On créé un nouveau document vide avec le modèle choisi contenant le pied
		[Courrier]WP_Document:=$selection[0].WP_Corps
		  // On réinsère le texte temporaire
		$plage:=WP Créer plage([Courrier]WP_Document;wk start text;wk end text)
		WP INSÉRER DOCUMENT($plage;$docTempo;wk replace;wk include in range)
		
	Sinon 
		
		  // Le document à inserer est un corps de document
		  // Insère le modèle en fin de sélection et inclu l'ensemble à la sélection
		WP INSÉRER DOCUMENT($plage;$selection[0].WP_Corps;wk append;wk include in range)
		
	Fin de si 
	
Fin de si 

Fin de boucle

</code 4D>

Bonjour

C’est assez étrange en effet (différences de comportement Mono Vs C/S).

Sans vouloir entrer dans le détail de votre code, j’aimerais cependant m’assurer d’une chose. Le champ sur lequel vous faites “$plage:=WP Créer plage([Courrier]WP_Document” a bien été initialisé par un WP New ?

On perd souvent de vue qu’il ne suffit pas de créer un champ de type objet pour en faire un document 4D Write pro. Même si on l’appelle WP_Document :slight_smile:

Voila un exemple assez simple qui ne marche PAS

<code 4D>
CREATE RECORD([WR_DOCS])
[WR_DOCS]Title:=“Alpha”
SAVE RECORD([WR_DOCS])

QUERY([WR_DOCS];[WR_DOCS]Title=“alpha”)
$range:=WP Create range([WR_DOCS]wpDocument;wk start text;wk end text) // ERROR
WP SET TEXT($range;“Alpha document”;wk append)
SAVE RECORD([WR_DOCS])

</code 4D>

Pour qu’il fonctionne, l faut impérativement ajouter une ligne

<code 4D>
CREATE RECORD([WR_DOCS])
[WR_DOCS]Title:=“Alpha”
[WR_DOCS]wpDocument:=WP New // MANDATORY LINE
SAVE RECORD([WR_DOCS])

QUERY([WR_DOCS];[WR_DOCS]Title=“alpha”)
$range:=WP Create range([WR_DOCS]wpDocument;wk start text;wk end text) // NO MORE ERROR
WP SET TEXT($range;“Alpha document”;wk append)
SAVE RECORD([WR_DOCS])

</code 4D>

Roland

Bonjour et merci pour votre réponse,

Je n’avais pas développé entièrement mes objets et m’étais arrêté à la simple présence du “Nouveau document 4D Write pro …”
Pour faire plus simple, avec le code ci-dessous “$selection[0].WP_Corps” retourne un document aberrant et incomplet évidemment repris par [Courrier]WP_Document l’erreur n’apparaissant qu’ensuite.
La plupart des mes documents ont été créés avec 4D Write, certains sont anciens, mais ça fonctionne en mono-poste ou en utilisant CHERCHER. Je viens de les sortir de leurs Champs blobs pour les transférer dans des nouveaux Champs objets.

Cordialement

<code 4D>
// Test pour faire simple

C_OBJET($plage)
C_OBJET($selection) // Objet plage
C_OBJET($docTempo) // Document temporaire
C_ENTIER LONG($i) // Compteur

CRÉER ENREGISTREMENT([Courrier])
[Courrier]WP_Document:=WP Nouveau

$selection:=ds.Modeles_textes.query(“Type_ = :1 and Libelle = :2”;“z_Modèles de 4D Write - Ne pas modifier”;“Modèle_nouvelle_zone_vide”)

Si ($selection.length)=1)
[Courrier]WP_Document:=$selection[0].WP_Corps
Fin de si

$plage:=WP Créer plage([Courrier]WP_Document;wk start text;wk end text)

// …

</code 4D>

[]26510854;“Traçage en version client - serveur”[/]

[]26510875;“Traçage en mono-poste”[/]

Je revient sur ce sujet. Testé aujourd’hui avec 4D V17R3 il n’y a plus d’erreur en client/serveur. Le problème est résolu.
Je clôture donc le sujet.