Μία από τις διαδικασίες για την υλοποίηση της σύνδεσης ενός e-shop που έχει υλοποιηθεί σε Opencart με καινούργια εγκατάσταση Softone είναι η εισαγωγή των ειδών από το OpenCart στο SoftOne.
Επικοινωνήστε μαζί μας για περισσότερα.
Ενδοεταιρική χρήση
Η παρακάτω διαδικασία χρησιμοποιήθηκε για την εισαγωγή δεδομένων στο S1 από το OpenCart στο e-pyramida.gr. Δεν είναι πλήρως αυτοματοποιημένη αλλά δούλεψε.
Προετοιμασία
- Ενημέρωση να μην κάνουν μεταβολές σε είδη κλπ
- Εξαγωγή δεδομένων με το Import/Export
- Διόρθωση στο excel
- των πεδίων που εμφανίζονται με επιστημονική μορφή
- της τιμής ώστε να έχει 4 δεκαδικά
- Κατέβασμα φωτογραφιών
Όλα τα αρχεία που χρησιμοποιήθηκαν είναι στον φάκελο:
Εισαγωγή Κατηγοριών
Η εισαγωγή έγινε από το categories.xls που βγάζει το import/export module του OC.
Φωτογραφίες έχει μόνο στις top κατηγορίες, τις έβαλα φωτογραφίες χειροκίνητα.
Προσθήκη στήλης SEO στη στήλη Q του φύλλου Categories και συμπλήρωση του seo με vlookup από το φύλλο CategorySEOKeywords.
Το μόνο πεδίο του S1 που παρουσιάζει μια ιδιαιτερότητα στον τρόπο ενημέρωσης από το export excel των κατηγοριών του OC είναι το sohcode. Θα πρέπει να γίνει μετατροπή της flat δομής του excel όπου η ιεραρχία φαίνεται με χρήση parent_id στη μορφή που θέλει το sohcode. Την έκανα με τις παρακάτω vba funtions σε ένα αρχείο access, τρέχοντας την level01 αφού κάνω import το excel στον πίνακα Categories και προσθέσω στήλη sohcode. Πιθανή βελτίωση: αφού μετρήσω τον αριθμό των παιδιών σε κάθε κλήση του level02 να προσθέτω μηδενικά πριν το i του επιπέδου. Δεν φαίνεται να χρειάζεται απαραίτητα για την ώρα.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
Sub level02(ByRef parent_id As Integer, ByRef sohcode As String) Dim db As DAO.Database Dim rec As DAO.Recordset Dim sql As String Dim i As Integer, rcount As Integer Set db = CurrentDb sqlstr = "SELECT * FROM Categories WHERE parent_id = " & parent_id & " AND sohcode IS NULL" Set rec = db.OpenRecordset(sqlstr) If Not rec.EOF Then rec.MoveLast rcount = rec.RecordCount rec.MoveFirst i = 0 While Not rec.EOF rec.Edit rec.Fields("sohcode") = sohcode & "." & i rec.Update DoEvents Debug.Print sohcode & "." & i & "-" & rec.Fields("fname") Call level02(rec.Fields("category_id"), rec.Fields("sohcode")) rec.MoveNext i = i + 1 Wend End If End Sub Sub level01() Dim db As DAO.Database Dim rec As DAO.Recordset Dim sql As String Dim i As Integer Set db = CurrentDb sqlstr = "SELECT * FROM Categories WHERE parent_id = 0" Set rec = db.OpenRecordset(sqlstr) i = 0 While Not rec.EOF rec.Edit rec.Fields("sohcode") = i rec.Update DoEvents Debug.Print i & "-" & rec.Fields("fname") Call level02(rec.Fields("category_id"), CStr(i)) rec.MoveNext i = i + 1 Wend End Sub |
Εισαγωγή Κατασκευαστών
Το export δεν κάνει εξαγωγή τον πίνακα των κατασκευαστών από το opencart αλλά βάζει απλά το όνομα στη στήλη manufacturer του excel. Θα πρέπει να γίνει αλλιώς η εξαγωγή και η εισαγωγή στο S1.
Είχε μόνο 22 κατασκευαστές, τους καταχώρησα χειροκίνητα στο φύλλο Manufacturers του products-yyyy-mm-dd.xls και τους έκανα εισαγωγή από εκεί στο S1 όπου πρόσθεσα πάλι χειροκίνητα τις φωτογραφίες.
- Συμπλήρωση του model όπου είναι κενό με το sku ή το product_id (με αυτή τη σειρά) (διορθωμένα με κίτρινο) γιατί κανονικά δεν μπορεί να είναι κενό.
- Επιλογή του πεδίου του model ως πεδίου που θα προστεθεί στο πεδίο Κωδικός Barcode (προσαρμογή ανάλογα το site)
- Επιλογή του product_id ως κωδικό είδους στο s1. Το import θα προσθέσει μηδενικά από αριστερά για να γίνει 6 ψηφία και να λειτουργει η ταξινόμηση σαν να είναι αριθμητικό. Εναλλακτικά μπορώ να τα προσθέσω εκ των υστέρων με την παρακάτω εντολή SQL που συμπληρώνει την τιμή στο πεδίο code με όσα μηδενικά χρειάζονται αριστερά για να έχει μήκος 6 χαρακτήρες. Αρχικά προσθέτει έξη μηδενικά αριστερά από την τιμή του πεδίου CODE και μετά κρατάει μόνο 6 από τους χαρακτήρες ξεκινώντας από τα δεξιά.
UPDATE MTRL SET CODE = RIGHT(‘000000’+ISNULL(CODE,”),6) WHERE SODTYPE=51 AND CCCOCID < 100000 - Σε όσα είδη έχει μόνο μία κατηγορία την αντέγραψα στο πεδίο Ομάδα. Έχει 385 είδη με πολλές κατηγορίες που θα πρέπει να ενημερωθούν χειροκίνητα.
Για την εισαγωγή του html κώδικα της στήλης description(el-gr) του export excel στο πεδίο ITEM.CCCOCDESCRIPTION προσθέτω στο object των ειδών το κώδικα του επόμενου comment που προσθέτει HTML κώδικα σε ένα blob πεδίο και εξάγει τον html κώδικα ενός blob πεδίου.
Συγκεκριμένα, μέσω της fuction ………… σε κάθε αλλαγή στο πεδίο ITEM.REMARKS καλείται η function AddHTMLtoBlob και προσθέτει το περιεχόμενο του ITEM.REMARKS με την κατάλληλη προσαρμογή στο ITEM.CCCOCDESCRIPTION.
Κατά το import Εισαγωγή από Opencart, αντιστοιχίζω την περιγραφή στην στήλη AC στο πεδίο ITEM.REMARKS και βάζω το Events σε αυτή την αντιστοίχηση ίσο με 1 ώστε να εκτελεστεί η function …………… και να εισαχθεί ότι προστέθηκε στο ITEM.REMARKS στο ITEM.CCCOCDESCRIPTION
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
//Κώδικας που χρησιμοποιήθηκε ως υπόδειγμα //πηγή: <a class="PrimaryLink BaseLink" href="https://github.com/SoftOne-Developers-Network/Javascript_SoftOne_Forms/blob/master/Add%20HTML%20to%20Blob%20-%20Get%20HTML%20from%20Blob.js" target="_blank" rel="noreferrer noopener">https://github.com/SoftOne-Developers-Network/Javascript_SoftOne_Forms/blob/master/Add%20HTML%20to%20Blob%20-%20Get%20HTML%20from%20Blob.js</a> //1. Add HTML to blob fields (function AddHTMLtoBlob) //2. Get HTML data from blob fields (function GetHTMLFromBlob) //The following example uses the object SOMAIL (Emails) and the blob field SOMAIL.SOBODY. function GetHTMLFromBlob(TableName, FieldName) { var vdsTable = X.EXEC('CODE:ModuleIntf.GetDataSet', X.MODULE, TableName); var vBlobField = X.EXEC('CODE:ModuleIntf.GetField', vdsTable, FieldName); var vBlobPointer = X.EXEC('CODE:SOHTMLDOC.CreateDoc', 2, vBlobField); var strHTML = X.EXEC('CODE:SOHTMLDOC.GetDocHTMLPart', vBlobPointer); X.EXEC('CODE:SOHtmlDoc.DestroyDoc', vBlobPointer); return strHTML; } function AddHTMLtoBlob(strhtml, TableName, FieldName) { var vdsTable = X.EXEC('CODE:ModuleIntf.GetDataSet', X.MODULE, TableName); var vBlobField = X.EXEC('CODE:ModuleIntf.GetField', vdsTable, FieldName); X.EXEC('CODE:ModuleIntf.DatasetEdit', vdsTable); var vBlobPointer = X.EXEC('CODE:SOHTMLDOC.CreateDoc', 1, strhtml); var strHTML = X.EXEC('CODE:SOHTMLDOC.SaveDoctoBlob', vBlobPointer, vBlobField); X.EXEC('CODE:SOHtmlDoc.DestroyDoc', vBlobPointer); } function EXECCOMMAND(cmd) { if (cmd == 20151201) X.WARNING(GetHTMLFromBlob('SOMAIL', 'SOBODY')); } function ON_SOACTION_COMMENTS() { var myHTML; myHTML = '<HTML><HEAD><TITLE>My Page</TITLE> ' + '<META content="text/html; charset=utf-8" http-equiv=Content-Type> ' + '</HEAD><BODY> ' + '<span style="font-size:18px; font-family: Segoe UI;">HTML text added from code </span><br />' + '</BODY></HTML>'; AddHTMLtoBlob(myHTML, 'SOMAIL', 'SOBODY'); } |
Κώδικας που χρησιμοποιήθηκε
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//Κώδικας όπως χρησιμοποιήθηκε function AddHTMLtoBlob(strhtml, TableName, FieldName) { var vdsTable = X.EXEC('CODE:ModuleIntf.GetDataSet', X.MODULE, TableName); var vBlobField = X.EXEC('CODE:ModuleIntf.GetField', vdsTable, FieldName); X.EXEC('CODE:ModuleIntf.DatasetEdit', vdsTable); var vBlobPointer = X.EXEC('CODE:SOHTMLDOC.CreateDoc', 1, strhtml); var strHTML = X.EXEC('CODE:SOHTMLDOC.SaveDoctoBlob', vBlobPointer, vBlobField); X.EXEC('CODE:SOHtmlDoc.DestroyDoc', vBlobPointer); } function ON_ITEM_REMARKS() { //X.WARNING("ON_ITEM_REMARKS"); var myHTML; myHTML = '<HTML><HEAD><TITLE>My Page</TITLE> ' + '<META content="text/html; charset=windows-1253" http-equiv=Content-Type> ' + '</HEAD><BODY> ' + '<span style="font-size:16px; font-family: Calibri;">'+ ITEM.REMARKS +'</span><br />' + '</BODY></HTML>'; AddHTMLtoBlob(myHTML, 'MTRL', 'CCCOCDESCRIPTION'); } |
Εισαγωγή Χαρακτηριστικών OpenCart (Εκδότες/Συγγραφείς)
- Δημιουργία Τύπων Χαρακτηριστικών S1 για τις Ομάδες Χαρακτηριστικών ως Ομαδ.Χαρακτ.OpenCart και συμπλήρωση του πεδίου CDIMCATEG.CCCOCID στον πίνακα με το id της ομάδας στο OC
- Δημιουργία Χαρακτηριστικών S1 για τα Χαρακτηριστικά του OC και συμπλήρωση του πεδίου CDIM.CCCOCID στον πίνακα με το id του χαρακτηριστικού στο OC
- Από το ProductAttributes στο export excel βρίσκω τις μοναδικές τιμές για κάθε χαρακτηριστικό (πχ Εκδότες, Συγγραφείς) και τις βάζω στο χαρακτηριστικό στο S1 ώστε να δημιουργηθούν τα αντίστοιχα CDIMLINES. Τα χαρακτηριστικά δεν πρέπει να έχουν κενά διαστήματα στην αρχή ή στο τέλος γιατί θα αφαιρεθούν κατά την εισαγωγή στο s1 και δεν θα ταυτίζονται (διορθώθηκαν συγγραφείς στα 143219,163495,200011)
- Τα ονόματα των attributes στον CDIMLINES μπορούν να έχουν μήκος ως 64 χαρακτήρες. Τροπποιήθηκε το 163536.
- Βγάζω όλα τα CDIMLINES και τα βάζω ως πίνακα στο export excel όπου με VLOOKUP αντιστοιχίζω σε κάθε γραμμή χαρακτηριστικού την τιμή του πεδίου CDIMLINES
- Αντιστοιχίζω επίσης το product_id στο mtrl του κάθε προϊόντος
- Φτιάχνω ένα excel με Company,Γραμμή,Mtrl,CDIMCATEG,CDIM,CDIMLINES και τον εισάγω απευθείας στον CCCOCATTR μέσα από το S1 με επεξεργασία πίνακα και paste from Clipboard. Να έχω αφαιρέσει τον editor από το CDIMCATEG για να μπορώ να κάνω paste το id. Στα CDIMCATG και CDIM μπορώ να κάνω paste και κείμενο αν δεν αφαιρέσω τους editors.
Έχω φτιάξει ένα vb.net project με το οποίο κάνω εισαγωγή των φωτογραφιών σε δύο βήματα:
- Πρώτα κάνω εισαγωγή της βασικής φωτογραφίας από το path που θα βρω στο ITEM.REMARKS σαν φωτογραφία του S1 και 1η/βασική φωτογραφία του e-shop. Η εισαγωγή του path της βασικής φωτογραφίας στο ITEM.REMARKS γίνεται με το import Εισαγωγή από Opencart μαζί με την εισαγωγή των ειδών στο s1.
- Μετά κάνω δεύτερη εισαγωγή με τις επιπλέον φωτογραφίες από τα path που θα βάλω χωρισμένα με κόμματα στο ITEM.REMARKS με το import Εισαγωγή επιπλέον εικόνων OC. Πρέπει να προετοιμάσω ένα excel με το φύλλο AdditionalImages του export excel στο οποίο έχω προσθέσει το mtrl για κάθε γραμμή (vlookup με τον κωδικό) και έχω τρέξει τον κώδικα παρακάτω που συμπυκνώνει τα path για κάθε κωδικό σε μία γραμμή.
Στον κώδικα του project είναι hardcoded και πρέπει να προσαρμοστούν το sql connection string και το τοπικό μέρος του path (πχ E:\WorkTemp\) όπου βρίσκονται οι φωτογραφίες.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
Sub MergeRows() //πηγή:<a class="PrimaryLink BaseLink" href="https://stackoverflow.com/questions/5942588/combine-multiple-rows-with-same-value-into-one-plus-more-in-excel" target="_blank" rel="noreferrer noopener">https://stackoverflow.com/questions/5942588/combine-multiple-rows-with-same-value-into-one-plus-more-in-excel</a> Dim rng As Range Dim vSrc As Variant Dim vDst() As Variant Dim i As Long, j As Long ' Assumes data starts at cell A2 and extends down with no empty cells Set rng = Range([A2], [A2].End(xlDown)) ' Count unique values in column A j = Application.Evaluate("SUM(IF(FREQUENCY(" _ & rng.Address & "," & rng.Address & ")>0,1))") ReDim vDst(1 To j, 1 To 2) j = 1 ' Get original data into an array vSrc = rng.Resize(, 2) ' Create new array, one row for each unique value in column A vDst(1, 1) = vSrc(1, 1) vDst(1, 2) = "'" & vSrc(1, 2) For i = 2 To UBound(vSrc, 1) If vSrc(i - 1, 1) = vSrc(i, 1) Then vDst(j, 2) = vDst(j, 2) & "," & vSrc(i, 2) Else j = j + 1 vDst(j, 1) = vSrc(i, 1) vDst(j, 2) = "'" & vSrc(i, 2) End If Next ' Remove old data rng.EntireRow.Delete ' Put new data in sheet Set rng = [A2].Resize(j, 2) rng = vDst End Sub |