Copier des champs documents en code

Request description

Bonjour,

Sur ce topic, je souhaitais copier les champs d’un objet dans un autre : Copier l'intégralité d'un objet métier via le code (sans copier les champs 1 par 1)

La solution marchait pour tous les champs que j’avais sauf 1 type de champ : les champs documents. Ces champs là ne sont pas copiés.

Une idée du problème ?

Technical information

Instance /health
[Platform]
Status=OK
Version=5.1.39
BuiltOn=2022-04-13 18:24
Git=release/e929cbae23c2441b4cb0a66b9501de0159ee7c92
Encoding=UTF-8
EndpointIP=10.201.117.43
EndpointURL=http://siparex-simplicite-dev-745fcf686c-ptkfp:8080
TimeZone=Europe/Paris
SystemDate=2022-04-20 10:29:26
Simplicité logs
NA

Bonjour,

En reprenant le bout de code du post précédent :

public void copyRecord(){
	ObjectDB obj = getGrant().getTmpObject("MyObject");
	if(obj.select(targetRowId)){// targetRowId is the row id of the record you want to override
		for(ObjectField f : getFields()){
			if(!f.isTechnicalField()){
				String val = f.getValue();
				String name = f.getName();
				obj.setFieldValue(name, val);
			}
		}
        //set document
        obj.getField("myDocField").setDocument(getField("myDocField").getDocument(getGrant())); 
		obj.save();
	}
}
1 Like

Est-ce que pour les champs multi documents cela fonctionne de la même manière ?

Bonne question, à priori oui. Je vous laisse me faire un retour si ce n’est pas le cas et je regarderai de plus près.

Visiblement, ça ne fonctionne pas :

if(newIdPart.equals(idPart) && !evlInstance.getRowId().equals(getRowId())){
	for(ObjectField f : this.getFields()){
		
		if(!f.getName().equals("row_id") && !f.getName().equals("created_dt") && !f.getName().equals("created_by") && !f.isTechnicalField() && !f.getName().equals("evlValCpnId") && !f.getName().equals("evlValInvId")){
			String val = f.getValue();
			String name = f.getName();
			
			evlInstance.setFieldValue(name, val);
		}
		
		if(f.isDocument()){
			AppLog.info("================= OK Document name : " + f.getName(), getGrant());
			String name = f.getName();
			
			evlInstance.getField(name).setDocument(f.getDocument(getGrant()));
		}
	}
	evlInstance.save();
}

Je passe bien dans mon if(f.isDocument()).

Bonjour,

Avez-vous du nouveau sur le sujet ?
Merci d’avance.

Bonjour,

On est toujours sur le sujet en interne. Je vous fait un retour rapidement.

1 Like

Bonjour,

Avez-vous des nouvelles sur ce sujet, ou est-ce que vous êtes toujours en discussion en interne ?

Bonjour Corentin,

Vous pouvez intégrer à votre code les éléments suivants (lorsque vous bouclez sur les attributs à copier) :

if(f.isMultiDocuments()){
	DocumentDB copiedDocs = copyAndGetDocuments(this, f, getRowId(), targetRowId);
	obj.getField(f.getName()).setDocument(copiedDocs);
	obj.getField(f.getName()).setValue(""); // cross reference not used
}

Avec copyAndGetDocuments(...) comme suit :

private DocumentDB copyAndGetDocuments(ObjectDB obj, ObjectField f, String rowId, String targetRowId){
	
	DocumentDB currentDocs = DocumentDB.getDocuments(obj, f, rowId);
	DocumentDB newDocs = new DocumentDB(true); //instantiate a multi-doc DocumentDB object
	if (currentDocs!=null) {
		List<DocumentDB> list = currentDocs.getDocuments();
		if (list!=null)
			for (DocumentDB d : list){
				try{
					DocumentDB newDoc = new DocumentDB(null, d.getName(), d.getBytes(true), getName(), f.getName(), targetRowId); //create a new DocumentDB per document found in list
					newDoc.setStatus(DocumentDB.STATUS_TO_UPLOAD);
					newDocs.add(newDoc); //add to list of documents
				}
				catch(IOException e){
					//handle IOException
				}
			}
	}
	return newDocs;
}
2 Likes

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.