Armando, buenos dias.
Te consulto: porque cambiar el campo auto incremental? Si es para mostrar en forma ordenada, Mysql te lo permite con la clausula ORDER BY.
Y el Xbrowse lo respeta perfectamente.
#INCLUDE "fivewin.ch"
#INCLUDE "tdolphin.ch"
FUNCTION Armando()
LOCAL oBrw, oCn, oRs, oForm, oBtn
CONNECT oCn HOST 'localhost' ;
USER 'root' ;
PASSWORD 'secret' ;
PORT 3306 ;
FLAGS 0;
DATABASE 'test'
if oCn == nil
? "can not connect to server"
return nil
endif
//Creo una tabla temporal
oCn:Execute("";
+ "CREATE TEMPORARY TABLE IF NOT EXISTS armando ";
+"( `id` INT(10) NOT NULL AUTO_INCREMENT, ";
+"`nombre` VARCHAR(50) NOT NULL,";
+"`orden` INT(10) NOT NULL,";
+"PRIMARY KEY (`id`)) ENGINE=INNODB DEFAULT CHARSET=utf8")
//Inserto lo basico
oCn:Execute("INSERT INTO armando (orden,nombre) VALUES (1,'Manzana'),(2, 'Pera'),(3, 'Naranja'),(4, 'Mandarina')")
oRs := oCn:query("SELECT * FROM armando ORDER BY orden ")
DEFINE DIALOG oForm TITLE "Armando" FROM 05,15 TO 36,99
@05,05 XBROWSE oBrw DATASOURCE oRs;
COLUMNS "orden","nombre";
HEADERS "Orden","Nombre";
SIZES 80,200;
OF oForm CELL SIZE 200,200 PIXEL
oBrw:CreateFromCode()
@ 05,220 BUTTON oBtn PROMPT "Insertar" SIZE 30,10 OF oForm PIXEL ACTION Insertar(oRs,oCn,oBrw)
ACTIVATE DIALOG oForm CENTER
RETURN nil
STATIC FUNCTION Insertar(oRs,oCn,oBrw)
LOCAL oDlg1, nOrden := 0, cNombre := SPACE(50), oGet := ARRAY(2), oBtn := ARRAY(2), lRta := .f.
DEFINE DIALOG oDlg1 TITLE "Insertar Registro" FROM 03,20 TO 14,60
@ 07, 05 SAY "Nombre:" OF oDlg1 PIXEL RIGHT SIZE 40,10
@ 22, 05 SAY "Orden:" OF oDlg1 PIXEL RIGHT SIZE 40,10
@ 05, 50 GET oGet[1] VAR cNombre OF oDlg1 PIXEL
@ 20, 50 GET oGet[2] VAR nOrden PICTURE "9999" OF oDlg1 PIXEL RIGHT
@ 35,30 BUTTON oBtn[1] PROMPT "&Grabar" OF oDlg1 SIZE 30,10 ;
ACTION ((lRta := .t.), oDlg1:End() ) PIXEL
@ 35,80 BUTTON oBtn[2] PROMPT "&Cancelar" OF oDlg1 SIZE 30,10 ;
ACTION ((lRta := .f.), oDlg1:End() ) PIXEL
ACTIVATE DIALOG oDlg1 CENTER
IF !lRta .or. nOrden <=0
RETURN nil
ENDIF
oCn:Execute("UPDATE armando SET orden = orden + 1 WHERE orden >= "+str(nOrden))
oCn:Execute("INSERT INTO armando (nombre,orden) VALUES ('"+cNombre+"',"+STR(nOrden)+")")
oRs:Refresh()
oBrw:Refresh(.t.)
RETURN nil
Es otra idea