Αδυναμία δημιουργίας νέου είδους μέσω script

251 views
Skip to first unread message

V. T.

unread,
Mar 4, 2025, 3:09:03 AM3/4/25
to Softone Developers Network

Καλησπέρα ομάδα,

Έχω αναλάβει ένα project όπου μέσα από ένα παραστατικό πωλήσεων πρέπει να γίνεται έλεγχος ενός κωδικού εργοστασίου (CODE2).
 Για αυτό τον σκοπό, έχει προστεθεί ένα RunButton και το πεδίο SALDOC.VARCHAR01. Ο χρήστης εισάγει έναν κωδικό στο πεδίο και πατώντας το κουμπί, εκτελείται ο εξής έλεγχος:

1️⃣ Αναζήτηση του κωδικού στον πίνακα MTRL (CODE2).
2️⃣ Αν δεν υπάρχει, γίνεται κλήση στο API του προμηθευτή για να βρεθεί το προϊόν.
3️⃣ Αν εντοπιστεί στο API, ζητείται επιβεβαίωση από τον χρήστη για να δημιουργηθεί το νέο είδος.
4️⃣ Αν ο χρήστης επιβεβαιώσει, εκτελείται το X.CreateObj("MTRL") ώστε να δημιουργηθεί το προϊόν στο SoftOne και να προστεθεί στις γραμμές (ITELINES).

Πρόβλημα:
Όταν καλώ X.CreateObj("MTRL"), λαμβάνω το σφάλμα:
"Σφάλμα: Δεν ήταν δυνατή η δημιουργία του αντικειμένου MTRL."

Δοκιμές που έκανα:
✅ X.CreateObjForm("MTRL") → Εμφανίζει το ίδιο σφάλμα.

Παρακάτω φαίνεται το script που έχω φτιάξει:

function checkOktabitAPI(factoryCode) {
    try {
        let url = "...";  // <-- Το πραγματικό url έχει αφαιρεθεί
        let token = "...";  // <-- Το πραγματικό token έχει αφαιρεθεί

        let xmlhttp = new ActiveXObject("MSXML2.XMLHTTP");
        xmlhttp.open("GET", url, false);
        xmlhttp.setRequestHeader("Authorization", "Token " + token);
        xmlhttp.setRequestHeader("Content-Type", "application/xml");
        xmlhttp.send();

        if (xmlhttp.status != 200) {
            X.WARNING("Σφάλμα κατά την κλήση του API. Κωδικός σφάλματος: " + xmlhttp.status);
            return;
        }

        let responseText = xmlhttp.responseText;
        if (!responseText) {
            X.WARNING("Δεν ελήφθη απάντηση από το API της ΟΚΤΑΒΙΤ.");
            return;
        }

        let xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = false;
        xmlDoc.loadXML(responseText);

        let items = xmlDoc.getElementsByTagName("item");
        var found = false;
        var description = "";
        var price = 0;

        for (var i = 0; i < items.length; i++) {
            var oktabitCode = items[i].getElementsByTagName("product_code")[0];
            if (oktabitCode && oktabitCode.text == factoryCode) {
                found = true;
                var nameNode = items[i].getElementsByTagName("titlos")[0];
                var priceNode = items[i].getElementsByTagName("timi_xontrikis")[0];

                description = nameNode ? nameNode.text : "Άγνωστο";
                price = priceNode ? parseFloat(priceNode.text) : 0;
                break;
            }
        }

        if (found) {
            X.WARNING("Ο κωδικός " + factoryCode + " βρέθηκε στην ΟΚΤΑΒΙΤ.\n" +
                   "Περιγραφή: " + description + "\n" +
                   "Τιμή: " + price.toFixed(2) + "€");

            let addItem = X.ASKYESNO("Θέλετε να καταχωρήσουμε το νέο είδος στο SoftOne;");
            if (addItem) {
                createNewItem(factoryCode, description, price);
            }
        } else {
            X.WARNING("Ο κωδικός " + factoryCode + " ΔΕΝ βρέθηκε στην ΟΚΤΑΒΙΤ.");
        }

    } catch (e) {
        X.WARNING("Σφάλμα επικοινωνίας με την ΟΚΤΑΒΙΤ: " + e.message);
    }
}

function createNewItem(factoryCode, description, price) {
    try {
        let myObj = X.CreateObjForm("MTRL");
        if (!myObj) {
            X.WARNING("Σφάλμα: Δεν ήταν δυνατή η δημιουργία του αντικειμένου MTRL.");
            return;
        }

        myObj.DBInsert;

        myObj.CODE2 = factoryCode;
        myObj.NAME = description;  
        myObj.PRICEW = price;      
        myObj.PRICER = price;      

        myObj.MTRACN = 301;        
        myObj.BUSUNITS = 5299;    
        myObj.MTRMANFCTR = 47;    
        myObj.MTRCATEGORY = 13;    
        myObj.EXPN1 = 305;        
        myObj.EXPVAL1 = price;    

        myObj.POST;

        X.WARNING("Το νέο είδος '" + description + "' καταχωρήθηκε επιτυχώς στο SoftOne.");
        addItemToSalesDoc(myObj.MTRL, description, price);

    } catch (e) {
        X.WARNING("Σφάλμα κατά την καταχώρηση του νέου είδους: " + e.message);
    }
}

Κάθε βοήθεια ευπρόσδεκτη!

Ευχαριστώ εκ των προτέρων.

Panagiotis Maniatakos

unread,
Mar 4, 2025, 3:32:53 AM3/4/25
to Softone Developers Network
Καλημέρα,

Διόρθωσε το σε X.CreateObjForm("ITEM").
Επίσης προτείνω για να πάρεις το MTRL του είδους που κάνεις insert να αλλάξεις τον κώδικα σε 

myObj.DBInsert;
var tblMtrl= myObj.FindTable('MTRL');  
tblMtrl.CODE2 = factoryCode;
tblMtrl.NAME = description;  
tblMtrl.PRICEW = price;      
tblMtrl.PRICER = price;      
tblMtrl.MTRACN = 301;        
tblMtrl.BUSUNITS = 5299;    
tblMtrl.MTRMANFCTR = 47;    
tblMtrl.MTRCATEGORY = 13;    
tblMtrl.EXPN1 = 305;        
tblMtrl.EXPVAL1 = price;    
tblMtrl.POST();
var mtrl= myObj.DBPOST;  

Επίσης δεν δίνεις κάποιο value στο tblMtrl.CODE. Αν έχει αυτόματη αρίθμηση το κύκλωμα της αποθήκης τότε πρόσθεσε και tblMtrl.CODE="*"

Mixalis Foulos

unread,
Mar 4, 2025, 8:40:19 AM3/4/25
to so...@googlegroups.com
Το είδος ανεξαρτήτως αν υπάρχει ή αν δεν υπάρχει μετά το καλείς στις γραμμές του παραστατικού ;



Για την Fulltech,

Μιχάλης Φούλος  |Μηχανογράφηση Επιχειρήσεων| FULLTECH

Κιν +30 6977569470 | Τηλ: +30 2531404287|m.foulos@fullltech.gr

Ανδρούτσου 20| 69100 Κομοτηνή | www.fulltech.gr



--
Softone Developers Network group.
To post to this group, send email to so...@googlegroups.com
---
Λάβατε αυτό το μήνυμα επειδή έχετε εγγραφεί στην ομάδα "Softone Developers Network" των Ομάδων Google.
Για να απεγγραφείτε απ' αυτή την ομάδα και να σταματήσετε να λαμβάνετε μηνύματα ηλεκτρονικού ταχυδρομείου απ' αυτή, στείλτε ένα μήνυμα ηλεκτρονικού ταχυδρομείου στη διεύθυνση soft1+un...@googlegroups.com.
Για να δείτε αυτή τη συζήτηση, επισκεφτείτε το https://groups.google.com/d/msgid/soft1/54eb445b-ff24-4ea3-bb56-45c4a1ca2a4dn%40googlegroups.com.

V. T.

unread,
Mar 4, 2025, 9:31:54 AM3/4/25
to Softone Developers Network
Μόνο εάν βρεθεί το είδος στον προμηθευτή τότε προστίθεται στις γραμμές του παραστατικού.

V. T.

unread,
Mar 7, 2025, 3:09:51 AM3/7/25
to Softone Developers Network
Καλημέρα,

Έπειτα από αλλαγές στο script και αφού όλα φαίνεται να λειτουργούν σωστά αντιμετωπίζω ένα διαφορετικό πρόβλημα.

Το πρόβλημα που αντιμετωπίζω είναι το εξής:

  • Μετά από λίγα δευτερόλεπτα εμφανίζεται ένα μήνυμα του συστήματος που ρωτάει αν θέλω να καταχωρηθεί η εγγραφή.
  • Αν πατήσω "Ναι", το SoftOne κολλάει και κλείνει.
  • Αν πατήσω "Όχι", το μήνυμα εμφανίζεται ξανά σε βρόχο.
  • Μόνο αν πατήσω "Ακύρωση", το μήνυμα κλείνει και η εφαρμογή συνεχίζει κανονικά.
  Παραθέτω τον κώδικά μου:

function checkItemCode(){
    let factoryCode = SALDOC.VARCHAR01;

    if (!factoryCode)
        X.EXCEPTION("\nΠαρακαλώ εισάγετε έναν κωδικό εργοστασίου στο πεδίο ελέγχου.");
   
    let ds = X.GETSQLDATASET("SELECT CODE2 FROM MTRL WHERE CODE2=:1 AND CODE2 IS NOT NULL", factoryCode);

    if (ds.RECORDCOUNT > 0) {
        X.WARNING("Ο κωδικός εργοστασίου " + factoryCode + " υπάρχει στον πίνακα MTRL.");
    } else {
        let proceed = X.ASKYESNO("Ο κωδικός " + factoryCode + " δεν βρέθηκε στο SoftOne.","Θέλετε να ελέγξουμε στην ΟΚΤΑΒΙΤ;");
        if (proceed) {
            checkOktabitAPI(factoryCode);

        }
    }
}

function checkOktabitAPI(factoryCode) {
    try {
        let url = "...";
        let token = "...";


        let xmlhttp = new ActiveXObject("MSXML2.XMLHTTP");
        xmlhttp.open("GET", url, false);
        xmlhttp.setRequestHeader("Authorization", "Token " + token);
        xmlhttp.setRequestHeader("Content-Type", "application/xml");
        xmlhttp.send();

        if (xmlhttp.status != 200) {
            X.WARNING("Σφάλμα κατά την κλήση του API. Κωδικός σφάλματος: " + xmlhttp.status);
            return;
        }

        let responseText = xmlhttp.responseText;
        if (!responseText) {
            X.WARNING("Δεν ελήφθη απάντηση από το API της ΟΚΤΑΒΙΤ.");
            return;
        }

        let xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = false;
        xmlDoc.loadXML(responseText);

        let items = xmlDoc.getElementsByTagName("item");
        var found = false;
        var description = "";
        var price = 0;
        var recycleCost = 0;


        for (var i = 0; i < items.length; i++) {
            var oktabitCode = items[i].getElementsByTagName("product_code")[0];
            if (oktabitCode && oktabitCode.text == factoryCode) {
                found = true;
                var nameNode = items[i].getElementsByTagName("titlos")[0];
                var priceNode = items[i].getElementsByTagName("timi_xontrikis")[0];
                var recycleNode = items[i].getElementsByTagName("kostos_anakyklosis_proiontos")[0];

                description = nameNode ? nameNode.text : "Άγνωστο";
                price = priceNode ? parseFloat(priceNode.text) : 0;
                recycleCost = recycleNode ? parseFloat(recycleNode.text) : 0;


                break;
            }
        }

        if (found) {
            X.WARNING("Ο κωδικός " + factoryCode + " βρέθηκε στην ΟΚΤΑΒΙΤ.\n" +
                   "Περιγραφή: " + description + "\n" +
                   "Τιμή: " + price.toFixed(2) + "€\n" +
                   "Κόστος Ανακύκλωσης: " + recycleCost.toFixed(2) + "€");

            let addItem = X.ASKYESNO("Μήνυμα Επιβεβαίωσης", "Θέλετε να καταχωρήσουμε το νέο είδος στο SoftOne;");
            if (addItem) {
                createNewItem(factoryCode, description, price, recycleCost);

            }
        } else {
            X.WARNING("Ο κωδικός " + factoryCode + " ΔΕΝ βρέθηκε στην ΟΚΤΑΒΙΤ.");
        }

    } catch (e) {
        X.WARNING("Σφάλμα επικοινωνίας με την ΟΚΤΑΒΙΤ: " + e.message);
    }
}

function createNewItem(factoryCode, description, price, recycleCost) {
    try {
        let myObj = X.CreateObjForm("ITEM");
        if (!myObj) {
            X.WARNING("Σφάλμα: Δεν ήταν δυνατή η δημιουργία του αντικειμένου ITEM.");
            return;
        }

        myObj.DBInsert;
        var tblMtrl = myObj.FindTable("MTRL");


        tblMtrl.CODE2 = factoryCode;
        tblMtrl.NAME = description;  
        tblMtrl.PRICEW = price;      
        tblMtrl.PRICER = price;      

        tblMtrl.BUSUNITS = 5299;    
        tblMtrl.MTRMANFCTR = 47;    
        tblMtrl.MTRCATEGORY = 13;    
        tblMtrl.EXPN1 = 305;        
        tblMtrl.EXPVAL1 = recycleCost;
        tblMtrl.MTRACN = 301;  

        tblMtrl.POST();
        var mtrl = myObj.DBPOST;  


        X.WARNING("Το νέο είδος '" + description + "' καταχωρήθηκε επιτυχώς στο SoftOne.");
        addItemToSalesDoc(mtrl, description, price);


    } catch (e) {
        X.WARNING("Σφάλμα κατά την καταχώρηση του νέου είδους: " + e.message);
    }
}

function addItemToSalesDoc(mtrl, description, price) {
    try {
        ITELINES.APPEND();  
        ITELINES.MTRL = mtrl;  
        ITELINES.QTY1 = 1;  
        ITELINES.PRICE = price;  
        ITELINES.POST();  

        X.WARNING("Το είδος προστέθηκε επιτυχώς στο παραστατικό!");
    } catch (e) {
        X.WARNING("Σφάλμα κατά την προσθήκη του είδους στο παραστατικό: " + e.message);
    }
}
  
  1. Τι μπορεί να προκαλεί το μήνυμα καταχώρησης εγγραφής μετά την εισαγωγή του είδους;
  2. Υπάρχει κάποιος τρόπος να αποτρέψω αυτή τη συμπεριφορά;

Κάθε βοήθεια θα ήταν πολύτιμη! Ευχαριστώ εκ των προτέρων. 

Alex Ts

unread,
Mar 7, 2025, 6:37:03 AM3/7/25
to Softone Developers Network
Άλλαξε  το X.CreateObjForm("ITEM") σε X.CreateObj("ΙΤΕΜ").

Νίκος Μάλιακκας

unread,
Mar 8, 2025, 4:46:50 AM3/8/25
to Softone Developers Network
Η CreateObjForm, "ανοίγει" το παράθυρο του αντικειμένου σε κατάσταση νέας εγγραφής,
μετά περνάμε ότι στοιχείο θέλουμε και τελειώνουμε με την 
var newID=myobj.ShowObjForm();

Το θέλεις , αν ο χρήστης είναι μπροστά κατά την εκτέλεση του script, και ο ίδιος θα αποφασίσει, αν θα καταχωρήσει την εγγραφή ή όχι. Το script σταματά εκεί και σου επιστρέφει το newID, ή το 0 αν ο χρήστης ακύρωσε την καταχώρηση.

Ανάλογα τώρα με την έκδοση του browser που χρησιμοποιείς έχει ένα τερτίπι:
με τον παλιό internet explorer παίζει και έτσι
var newID=myobj.ShowObjForm;
(χωρίς παρενθέσεις)

με τον edge και το /usewebview2
θέλει παρενθέσεις

σε κάθε περίπτωση, αν δεν εμφανίσεις το παράθυρο με την ShowObjForm, πρέπει στις πρόσφατες εκδόσεις η softone να έβαλε ένα timeout timer που σου πετάει το μήνυμα για το τι να κάνεις το παράθυρο που περιμένει να ανοίξει με την 
ShowObjForm

Αν πήρες το script από παλιό κώδικα, τότε πρέπει να τον ενημερώσεις, γιατί ναι μεν αυτό έπαιζε παλιότερα, τώρα δεν παίζει.

Panagiotis Athanasopoulos

unread,
Feb 11, 2026, 9:22:42 AM (13 days ago) Feb 11
to Softone Developers Network
Λίγο παλιό το θέμα, αλλά είχα ένα αντίστοιχο πρόβλημα:

Ήθελα να τρέξω function που χρησιμοποιεί το ShowObjForm για να δημιουργήσει χιλιάδες πελάτες, με unattended λογική.

Το παραπάνω ζήτημα με τον timeout timer με είχε τρελάνει, γιατί δεν καταλάβαινα από που προερχόταν και με ανάγκαζε να πατάω 'Ναι' ή 'Ακύρωση' ανά καταχώρηση.

Η λύση που μου δούλεψε ήταν να προσθέσω στο τέλος ένα:
obj.EXEC('Button:Save');

Εφόσον το πρόβλημα φαίνεται να είναι ότι η φόρμα δεν καταλαβαίνει σωστά το POST ως save και θεωρεί ότι έχει αλλαγές που δεν έχουν αποθηκευτεί, πρακτικά πατάμε και το κουμπάκι 'Save' όταν έχουμε τελειώσει.

Νίκος Μάλιακκας

unread,
Feb 11, 2026, 12:35:33 PM (13 days ago) Feb 11
to Softone Developers Network
Θα συνιστούσα την χρήση των CreateObjForm/ ShowObjForm σε περιπτώσεις που ο χρήστης θα χρειαστεί να κάνει την επιβεβαίωση και αποθήκευση της εγγραφής.
Σε unattended λογική θα χρησιμοποιούσα την CreateObj και θα αποθήκευα με την  DBPOST.
Για εισαγωγή κατά χιλιάδες, οι  CreateObjForm/ ShowObjForm πιθανών να γεμίζουν την μνήμη, μιας και θα φτιάχνει νέο αντικείμενο σε κάθε νέα εγγραφή.
Στην  CreateObj  /  DBPOST μπορείς να ξαναχρησιμοποιήσεις το ίδιο αντικείμενο για να κάνεις πολλές εισαγωγές.
Αλλά και στην  CreateObj  /  DBPOST θα πετύχεις γέμισμα της μνήμης σε υπερβολικά μεγάλο πλήθος εγγραφών (εγώ κάνω recycle το object κάθε 300 καταχωρήσεις)

Για πολύ μαζική εισαγωγή παίζει και η setData από την WEBREQUEST, αν και ζορίζεται σε μεγάλα παραστατικά.
Reply all
Reply to author
Forward
0 new messages