Shaba,
thi is my code to sort the BOM by "codice", "fornitore" and "tipo".
the result in the attachment.
Code:
(defun ordinaBOM ()
(sd-hide-display-table "AM-BOM-DATA-DTAB")
(AM_BOM_NUMBERS :clear) ;azzera tutte le posizioni
(setq ltab (sd-get-display-table-logical-table "AM-BOM-DATA-DTAB"))
(setq row-number (sd-get-logical-table-number-of-rows ltab))
(setq i 0)
(loop
(setq POS_NO (sd-Read-logical-table-cell ltab :row 0 :column :DOCU_BOM_POS_NO))
(when (sd-string/= POS_NO "") (return) )
(setq rowtableDB (sd-read-logical-table-row ltab :row 0))
(setq ENTRY_ID (sd-Read-logical-table-cell ltab :row 0 :column :DOCU_BOM_ENTRY_ID ))
(setq lengrow (length rowtableDB))
(dotimes (j lengrow)
(if (string= (nth j rowtableDB) ":PART_CODE ") (setq CODICE (nth (+ j 1) rowtableDB)))
(if (string= (nth j rowtableDB) ":bom3d-Fornitore-attr-cont ") (setq FORNITORE (nth (+ j 1) rowtableDB)))
(if (string= (nth j rowtableDB) ":bom3d-classe-merc-attr-cont ") (setq TIPO (nth (+ j 1) rowtableDB)))
)
(if (not FORNITORE) (setq FORNITORE ""))
(COND
((OR (and (sd-string/= (sd-string-trim FORNITORE) "") (sd-string= (sd-string-trim Tipo) "XXX"))
(sd-string= (sd-string-trim Tipo) "COM") ) (AM_POS_CHG_NO :BOM_ENTRY_ID ENTRY_ID :new_pos_no (format nil "A ~a~a~a" (SD-STRING-UPCASE (sd-string-trim FORNITORE)) (SD-STRING-UPCASE (sd-string-trim CODICE)) i )))
((AND (sd-string/= (sd-string-trim CODICE) "") (sd-string= (sd-string-trim Tipo) "MEC")) (AM_POS_CHG_NO :BOM_ENTRY_ID ENTRY_ID :new_pos_no (format nil "C ~a" CODICE)))
(T (AM_POS_CHG_NO :BOM_ENTRY_ID ENTRY_ID :new_pos_no (format nil "X ~a" i )))
; (T (AM_POS_CHG_NO :BOM_ENTRY_ID ENTRY_ID :new_pos_no (format nil "D ~a~a~a" (SD-STRING-UPCASE (sd-string-trim DESCRIZIONE)) (SD-STRING-UPCASE (sd-string-trim PARTE)) i )))
) ;COND
(incf i)
) ;endloop
(AM_BOM_NUMBERS :by_step :on :by_step_start 1 :by_step_incr 1)
(setq i (- row-number 1))
(loop
(when (< i 0) (return) )
(DISPLAY (format nil "~A gia' presente!" CODICE))
(setq POS_NO (sd-Read-logical-table-cell ltab :row i :column :DOCU_BOM_POS_NO))
(setq ENTRY_ID (sd-Read-logical-table-cell ltab :row i :column :DOCU_BOM_ENTRY_ID ))
(setq rowtableDB (sd-read-logical-table-row ltab :row i))
(setq lengrow (length rowtableDB))
(dotimes (j lengrow)
(if (string= (nth j rowtableDB) ":PART_CODE ") (setq CODICE (nth (+ j 1) rowtableDB)))
(if (string= (nth j rowtableDB) ":bom3d-Fornitore-attr-cont ") (setq FORNITORE (nth (+ j 1) rowtableDB)))
(if (string= (nth j rowtableDB) ":bom3d-classe-merc-attr-cont ") (setq TIPO (nth (+ j 1) rowtableDB)))
)
(if (not FORNITORE) (setq FORNITORE ""))
(COND
((sd-string= (sd-string-trim Tipo) "ASS") (AM_POS_CHG_NO :BOM_ENTRY_ID ENTRY_ID :new_pos_no (format nil "~a" CODICE)))
((AND (sd-string= (sd-string-trim FORNITORE) "")
(sd-string/= (sd-string-trim Tipo) "MEC")) (AM_POS_CHG_NO :BOM_ENTRY_ID ENTRY_ID :new_pos_no (format nil "X~a" POS_NO)))
((sd-string= (sd-string-trim Tipo) "MEC") (AM_POS_CHG_NO :BOM_ENTRY_ID ENTRY_ID :new_pos_no (format nil "~a" CODICE)))
) ;COND
(decf i)
)
(display :clear-hide)
)