Import CSV for product (and stock..) An nightmare

After reading the posts on forum, I still can’t import my products datas and products stock.

I use csv files on demo directory with my data, but no sucess…

How I can read the stockLocation ID on DB and productId also on DB into self exe installation under windows ? To see if my csv value is correct on my file. (Main error reported : Null value)

I launch the exe with default db password so I don’t know this password to acces with postgre util.

Thanks

King regards

Nicolas

Si vous êtes prêt à vous investir dans de l’automatisation, je vous oriente sur l’application n8n. j’ai codé un node dédié à Axelor.

Pour rester sur des manipulations Axelor, vous pouvez faire des exports personnalisés/avancés.
la table/domaine lié aux produits dans Axelor : com.axelor.apps.base.db.Product

Pour ce qui est « stockLocation », il vous faut d’abord créer ces « lieux » de stockage.


Je profite de ce sujet pour alerter un admin d’axelor @gdu-axelor
Je vois que vous avez une nouvelle interface de la documentation (je découvre ce jour).
Dans la version 6.5, il n’y a pas le module Stock Management, j’imagine que c’est pas normal vu l’importance des stocks, j’ai du aller dans la version précédente pour proposer la partie emplacement de stock.

Merci pour la réponse, j’ai bien crée mes lieux de stockage pas de soucis mais si je comprends bien les colonnes attendues dans le CSV c’est un id qu’il faut pas le nom du lieu de stockage que j’ai donné non ?

Je pourrais aller voir en base ça serait plus simple mais pas réussi pour l’instant (j’ai pas le password par défaut de l’installation en autonome avec l’exe).

je ne suis pas familier avec les imports csv.

Très probable que ce soit uniquement l’ID du stock location,
et dans le nom de la colonne préciser stockLocation.id pour pouvoir réaliser l’import correctement.

Bonjour,

Nous avons rarement la main sur les id des enregistrements. La bonne méthode pour importer des données consiste à utiliser les champs ImportId et éventuellement ImportOrigin (si la datas provient de plusieurs outils). Le champ ImportId est une zone de texte unique par table, qui permet de définir un identiant (intégré via l’import des données) et sert de clé de recherche pour la mise à jour ou pour définir une référence depuis une autre table.

@dtneo Merci pour ce retour. Nous avons attaqué un gros chantier de refonte de la documentation. Dans un premier temps nous avons revu le module Comptabilité.
Lorsqu’un module n’est pas encore disponible dans la dernière version, nous redirigeons vers la version précédente. Il doit y avoir un oublis pour le module Stock.
Nous allons ajouter prioritairement les nouveautés et travailler progressivement sur la reprise de l’existant. Le documentation des applications mobiles sera également disponible prochainement. Dans un second temps, nous allons ajouter la documentation des modules Addons / Enterprise.

2 « J'aime »

En relisant, s’il parle d’import de STOCK de produits avec l’information du stocklocation, c’est un inventaire à faire pour créer le stock initiale.
l’ID du sotkc location est necessaire pour attribuer les quantité de produits à un emplacement de stock

Inventory et inventoryLine (pour les domaines d’import csv pour les stocks)

ensuite c’est les StockMove et StockMoveLine pour faire des arrivés et départs de produits.

c’est bien cela c’est pour l’injection « initiale » donc par un inventaire d’après ce que j’ai lu.

Vous créez manuellement l’inventaire. À la fin de l’URL quand vous avez le document ouvert, c’est l’ID de l’inventaire.
En complément vous exportez cet inventaire, histoire d’avoir les info complémentaire.
Eventuellement vous faites une ligne de produit à l’intérieur de cet inventaire et vous exportez « inventoryLine »

Pour l’ajout massif des lignes de cette inventaire, vous faites l’import de inventoryLine de l’ID de l’inventaire.
c’est une sorte de mise à jour de cette inventaire mais avec toutes les lignes que vous voulez sans les créer manuellement.

Have fun :stuck_out_tongue:

C’est bien ce que je fais depuis des heures… Si j’aurais l’exception entière je pourrais comprendre mais avec ça : com.axelor.data.ImportException: java.lang.reflect.InvocationTargetException …
Même un export avancé avec tous les champs d’une ligne d’inventaire puis ré-import du même fichier ça ne passe pas … Et j’essaye 1 seule ligne alors que j’en ai des milliers à importer…

2023-06-05 16:26:16.681 INFO 27768 — [http-nio-8081-exec-5] com.axelor.data.csv.CSVImporter : Importing com.axelor.apps.stock.db.InventoryLine from stock_inventoryLine.csv
2023-06-05 16:26:16.681 DEBUG 27768 — [http-nio-8081-exec-5] com.axelor.data.csv.CSVImporter : Header [Inventory.Id, product.code, currentQty, realQty, Inventaire, stockLocation_Name]
2023-06-05 16:26:16.687 ERROR 27768 — [http-nio-8081-exec-5] com.axelor.data.csv.CSVImporter : Error while importing stock_inventoryLine.csv.
2023-06-05 16:26:16.688 ERROR 27768 — [http-nio-8081-exec-5] com.axelor.data.csv.CSVImporter : Unable to import record #1: [6, BOUL5X10, 40, 40, INV00004, MAGASIN]
com.axelor.data.ImportException: com.axelor.data.ImportException: java.lang.reflect.InvocationTargetException
at com.axelor.data.ImportException.from(ImportException.java:47)
at com.axelor.data.csv.CSVImporter.process(CSVImporter.java:326)
at com.axelor.data.csv.CSVImporter.process(CSVImporter.java:229)
at com.axelor.data.csv.CSVImporter.run(CSVImporter.java:200)
at com.axelor.apps.base.service.imports.importer.ImporterCSV.process(ImporterCSV.java:37)
at com.axelor.apps.base.service.imports.importer.Importer.run(Importer.java:115)
at com.axelor.apps.base.service.imports.importer.Importer.run(Importer.java:122)
at com.axelor.apps.base.service.imports.ImportService.run(ImportService.java:37)
at com.axelor.apps.base.web.ImportConfigurationController.run(ImportConfigurationController.java:44)
at sun.reflect.GeneratedMethodAccessor1357.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.axelor.meta.ActionHandler.call(ActionHandler.java:261)
at com.axelor.meta.schema.actions.ActionMethod.evaluate(ActionMethod.java:76)
at com.axelor.meta.schema.actions.Action.execute(Action.java:100)
at com.axelor.meta.schema.actions.Action.wrap(Action.java:113)
at com.axelor.meta.schema.actions.ActionGroup.evaluate(ActionGroup.java:231)
at com.axelor.meta.schema.actions.Action.execute(Action.java:96)
at com.axelor.meta.schema.actions.Action.wrap(Action.java:113)
at com.axelor.meta.ActionHandler.execute(ActionHandler.java:529)
at com.axelor.meta.ActionExecutor.execute(ActionExecutor.java:57)
at com.axelor.meta.ActionExecutor$$EnhancerByGuice$$59cb6651.CGLIB$execute$0()
at com.axelor.meta.ActionExecutor$$EnhancerByGuice$$59cb6651$$FastClassByGuice$$f0f227af.invoke()
at com.google.inject.internal.cglib.proxy.$MethodProxy.invokeSuper(MethodProxy.java:228)
at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:76)
at com.axelor.rpc.ResponseInterceptor.invoke(ResponseInterceptor.java:58)
at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:78)
at com.google.inject.internal.InterceptorStackCallback.intercept(InterceptorStackCallback.java:54)
at com.axelor.meta.ActionExecutor$$EnhancerByGuice$$59cb6651.execute()
at com.axelor.web.service.ActionService.execute(ActionService.java:107)
at com.axelor.web.service.ActionService$$EnhancerByGuice$$6e3a19da.CGLIB$execute$0()
at com.axelor.web.service.ActionService$$EnhancerByGuice$$6e3a19da$$FastClassByGuice$$85164d8.invoke()
at com.google.inject.internal.cglib.proxy.$MethodProxy.invokeSuper(MethodProxy.java:228)
at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:76)
at com.axelor.rpc.RequestFilter.invoke(RequestFilter.java:55)
at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:78)
at com.axelor.rpc.ResponseInterceptor.invoke(ResponseInterceptor.java:67)
at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:78)
at com.google.inject.internal.InterceptorStackCallback.intercept(InterceptorStackCallback.java:54)
at com.axelor.web.service.ActionService$$EnhancerByGuice$$6e3a19da.execute()
at sun.reflect.GeneratedMethodAccessor555.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:140)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:294)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:248)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:235)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:398)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:205)
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:228)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:89)
at com.axelor.db.tenants.AbstractTenantFilter.doFilter(AbstractTenantFilter.java:70)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
at org.apache.shiro.guice.web.SimpleFilterChain.doFilter(SimpleFilterChain.java:44)
at io.buji.pac4j.filter.SecurityFilter.lambda$doFilter$0(SecurityFilter.java:86)
at org.pac4j.core.engine.DefaultSecurityLogic.perform(DefaultSecurityLogic.java:140)
at com.axelor.auth.pac4j.AuthPac4jModule$AxelorSecurityFilter$1.perform(AuthPac4jModule.java:485)
at com.axelor.auth.pac4j.AuthPac4jModule$AxelorSecurityFilter$1.perform(AuthPac4jModule.java:469)
at io.buji.pac4j.filter.SecurityFilter.doFilter(SecurityFilter.java:84)
at org.apache.shiro.guice.web.SimpleFilterChain.doFilter(SimpleFilterChain.java:41)
at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)
at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
at com.axelor.app.internal.AppFilter.doFilter(AppFilter.java:94)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
at com.google.inject.persist.PersistFilter.doFilter(PersistFilter.java:94)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
at com.axelor.db.tenants.AbstractTenantFilter.doFilter(AbstractTenantFilter.java:70)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
at com.axelor.web.servlet.CorsFilter.doFilter(CorsFilter.java:137)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:121)
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:133)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:698)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:367)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:639)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:882)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1647)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:750)
Caused by: com.axelor.data.ImportException: java.lang.reflect.InvocationTargetException
at com.axelor.data.csv.CSVInput.call(CSVInput.java:211)
at com.axelor.data.csv.CSVImporter.importRow(CSVImporter.java:406)
at com.axelor.data.csv.CSVImporter.process(CSVImporter.java:317)
… 103 common frames omitted
Caused by: java.lang.reflect.InvocationTargetException: null
at sun.reflect.GeneratedMethodAccessor560.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.axelor.data.csv.CSVInput.call(CSVInput.java:208)
… 105 common frames omitted
Caused by: java.lang.NullPointerException: null
at com.axelor.apps.stock.service.InventoryLineService.compute(InventoryLineService.java:130)
at com.axelor.csv.script.ImportInventoryLine.importInventoryLine(ImportInventoryLine.java:58)
at com.google.inject.persist.jpa.JpaLocalTxnInterceptor.invoke(JpaLocalTxnInterceptor.java:56)
at sun.reflect.GeneratedMethodAccessor560.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.axelor.data.csv.CSVInput.call(CSVInput.java:208)
at com.axelor.data.csv.CSVImporter.importRow(CSVImporter.java:406)
at com.axelor.data.csv.CSVImporter.process(CSVImporter.java:317)
at com.axelor.data.csv.CSVImporter.process(CSVImporter.java:229)
at com.axelor.data.csv.CSVImporter.run(CSVImporter.java:200)
at com.axelor.apps.base.service.imports.importer.ImporterCSV.process(ImporterCSV.java:37)
at com.axelor.apps.base.service.imports.importer.Importer.run(Importer.java:115)
at com.axelor.apps.base.service.imports.importer.Importer.run(Importer.java:122)
at com.axelor.apps.base.service.imports.ImportService.run(ImportService.java:37)
at com.axelor.apps.base.web.ImportConfigurationController.run(ImportConfigurationController.java:44)
at sun.reflect.GeneratedMethodAccessor1357.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.axelor.meta.ActionHandler.call(ActionHandler.java:261)
at com.axelor.meta.schema.actions.ActionMethod.evaluate(ActionMethod.java:76)
at com.axelor.meta.schema.actions.Action.execute(Action.java:100)
at com.axelor.meta.schema.actions.Action.wrap(Action.java:113)
at com.axelor.meta.schema.actions.ActionGroup.evaluate(ActionGroup.java:231)
at com.axelor.meta.schema.actions.Action.execute(Action.java:96)
at com.axelor.meta.schema.actions.Action.wrap(Action.java:113)
at com.axelor.meta.ActionHandler.execute(ActionHandler.java:529)
at com.axelor.meta.ActionExecutor.execute(ActionExecutor.java:57)
at com.axelor.rpc.ResponseInterceptor.invoke(ResponseInterceptor.java:58)
at com.axelor.web.service.ActionService.execute(ActionService.java:107)
at com.axelor.rpc.RequestFilter.invoke(RequestFilter.java:55)
at com.axelor.rpc.ResponseInterceptor.invoke(ResponseInterceptor.java:67)
… 65 common frames omitted

Première chose, ici il y a un exemple :

Ensuite, lisez tout ce que @ bDurtaut écris au sujet des imports, comme ici :
https://forum.axelor.com/search?q=@bDurtaut%20import


J’utilise les API de mon côté, et je vois qu’il y a beaucoup de différences avec les csv.
Voici ce que je récupère en API sur la structure de la table.

La table inventoryLine est construite ainsi :

si vous voulez basculer sur n8n, je serai largement plus compétent.

Continuez à nous dire ou vous en êtes

Merci pour les réponses mais c’est bon je lâche l’affaire j’ai passé la journée hier et 3h ce matin et il manque toujours 2 balles pour faire 1 Franc…
Dommage j’évaluais ERP pour remplacer notre ERP actuel (Clipper) mais quand je vois la galère pour arriver à importer une simple donnée j’imagine pas pour importer la base article, les gammes de fabrication, les employés etc…
Merci quand même

PS : n8n à l’air bien mais je ne peut pas l’utiliser dans mon environnement (contraintes techniques et d’utilisation)