FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour C贸mo Insertar registros a na tabla?
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
C贸mo Insertar registros a na tabla?
Posted: Sun Jan 26, 2025 05:56 PM

Amigos del foro:

Hoy les pido ayuda y escuchar sus sabios consejos para, teniendo una tabla con n cantidad de registros, c贸mo insertar

n cantidad de registros en cierta posici贸n?, me explico con un ejemplo, si tengo la tabla con estos registros, con dos campo

para no complicar las cosas, el n煤mero que antecede al nombre de las frutas es de un campo auto incrementable.

1 Manzana

2 Pera

3 Naranja

4 Mandarina

Si quiero insertar Lima entre Pera y Naranja para quedar as铆

1 Manzana

2 Pera

3 Lima

4 Naranja

5 Mandarina

Tengo la idea de c贸mo hacerlo pero me gustar铆a escuchar sus soluciones para no "inventar el agua caliente",

con el pseudoc贸digo ser铆a suficiente.

Saludos cordiales a todos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: C贸mo Insertar registros a na tabla?
Posted: Mon Jan 27, 2025 06:05 PM

Amigos:

Lo he resuelto pasando los registros a una nueva tabla temporal, pero me gustar铆a saber

si alguien lo haya hecho de otra forma. muestro aqu铆 c贸mo lo hice por si a alguien mas le sirve.

1.- Estando el foco en el browse, el usuario oprime la tecla INS

2.- En un dialogo solicito el n煤mero de renglones o registros a insertar

3.- Identifico el n煤mero de registros donde el usuario dio el clic, recuerden que tengo una columna auto incrementable

4.- Con un DO WHILE paso los registros a la tabla temporal, si el n煤mero de registro a copiar es mayor que el numero de registro donde el usuario dio clic, entro en un FOR NEXT para agregar, a la tabla temporal, el n煤mero de registros que el usuario quiere insertar, al terminar el FOR NEXT sigo pasando los registros faltantes hasta llegar al final de la tabla

5.- Por 煤ltimo, limpio la tabla original y copio todos los registros de la tabla temporal y refresco el browse

Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: C贸mo Insertar registros a na tabla?
Posted: Mon Jan 27, 2025 10:30 PM

No s茅 si se puede insertar un registro de la misma manera que se hace con una array.

Yo lo har铆a usando un 铆ndice y un campo "DUMMYREC"

1潞 Veo la DBF en Xbrowse con el 铆ndice sobre campo DUMMYREC

2潞 Estoy en el registro 89.

3潞 Voy a insertar 4 registros

4潞 Voy al '煤ltimo' registro.

5潞 Hago

While Recno() <> 89

DUMMYREC := DUMMYREC + 4 con

Skip(-1)

End

nMyDUMMYREC := DUMMYREC - 4

6潞 Hago esto 4 veces

Append()

DUMMYREC := nMyDUMMYREC++

7潞 Aplico el 铆ndice sobre el campo DUMMYREC

Creo que funcionar铆a.

Si mientras trabaja el sistema se cae, reindexando no se pierde nada.

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: C贸mo Insertar registros a na tabla?
Posted: Mon Jan 27, 2025 11:48 PM

Amigo Carlos:

Es parecido a lo que hago, una diferencia es que yo utilizo tablas MySql con ADO.

Gracias por la idea.

Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 1144
Joined: Mon Feb 05, 2007 07:15 PM
Re: C贸mo Insertar registros a na tabla?
Posted: Tue Jan 28, 2025 03:41 PM
hacer eso en una tabla de 1 millon de reregistros OPS :o :shock:
Cesar Cortes Cruz

SysCtrl Software

Mexico



' Sin +- FWH es mejor "
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: C贸mo Insertar registros a na tabla?
Posted: Tue Jan 28, 2025 04:57 PM
Armando wrote: Amigo Carlos:

Es parecido a lo que hago, una diferencia es que yo utilizo tablas MySql con ADO.

Gracias por la idea.

Saludos
Entonces con m谩s motivo.

Si no voy equivocado, en DBF se a帽aden al final del fichero, en MySql es el propio motor que decide donde grabarlo, por tanto yo usar铆a un 铆ndice para lo que mencionas.

Y tal como dice C茅sar, con 1 mill贸n de registros...

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: C贸mo Insertar registros a na tabla?
Posted: Tue Jan 28, 2025 07:37 PM

Paisano, y amigos:

Afortunadamente el browse puede llegar tener hasta 50 registros.

Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 537
Joined: Mon Jan 16, 2006 03:42 PM
Re: C贸mo Insertar registros a na tabla?
Posted: Wed Jan 29, 2025 11:34 AM

Hola Armando.. yo lo hago de otra forma, tengo un contador que va de 3 o 5 en 5 y cuando estoy en browse le sumo +1 al contador actual

eso asi de facil

saludos

Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: C贸mo Insertar registros a na tabla?
Posted: Wed Jan 29, 2025 04:24 PM

Hola Jos茅:

Es otra alternativa, muchas gracias

Saludos al crio

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: C贸mo Insertar registros a na tabla?
Posted: Thu Jan 30, 2025 11:24 AM
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
Posts: 1144
Joined: Mon Feb 05, 2007 07:15 PM
Re: C贸mo Insertar registros a na tabla?
Posted: Thu Jan 30, 2025 05:11 PM
Interesante tocayo,
hay que probar :shock:
Cesar Cortes Cruz

SysCtrl Software

Mexico



' Sin +- FWH es mejor "
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: C贸mo Insertar registros a na tabla?
Posted: Fri Jan 31, 2025 01:00 AM

C茅sar:

Aportando, como siempre, en mi caso, acepto que en mi primer post no lo puse, pueden existir registros en blanco

el usuario los necesita como separadores, entonces el campo auto incremental es obligado.

Adem谩s, en ocasiones el usuario puede cambiar el orden dando clic en el encabezado del browse, si fuera el caso,

despu茅s ya no podr铆a volver al 贸rrden de captura y todos los registros en blanco quedar铆an al principio del browse

Muchas gracias por tu tiempo y ejemplo.

Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: C贸mo Insertar registros a na tabla?
Posted: Fri Jan 31, 2025 10:17 AM

Armando, en el ejemplo que te pas茅, hay un campo autoincremental que lo va a manejar la base de datos, que va a ser el orden natural que el usuario vaya ingresando los datos, luego el campo orden que va a ser unico para que el usuario pueda darle un orden, y un campo nombre (por el cual tambien se puede ordernar si quieres en xbrowse agregando la clausula AUTOSORT) por si lo quiere ordenarlo por ese campo.

Seguramente no estoy comprendiendo bien tu necesidad final, pero Fivewin y Mysql pueden darte la solucion que necesitas.

Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: C贸mo Insertar registros a na tabla?
Posted: Sat Feb 01, 2025 12:41 AM

C茅sar:

Muchas gracias, as铆 es como lo resolv铆.

Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: C贸mo Insertar registros a na tabla?
Posted: Mon Feb 03, 2025 10:01 PM
Another way, using only Auto-increment field.
#include "fivewin.ch"

//----------------------------------------------------------------------------//

function Main()

   local oCn, oRs

   oCn   := Fw_OpenAdoConnection( "MYSQL,209.250.245.152,fwh,fwhuser,FiveTech@2022", .t. )
   oRs   := CreateTableFruits( oCn )

   // Right-click to insert a new fruit
   XBROWSER oRs TITLE "FRUITS" SETUP ( ;
      oBrw:bRClicked := { |r,c,f,o| InsertFruit( oRs ), o:Refresh() } )

   oRs:Close()
   oCn:Close()

return nil

//----------------------------------------------------------------------------//

function CreateTableFruits( oCn )

   local oRs, v

   oCn:Execute( "DROP TABLE IF EXISTS fruits" )
   FWAdoCreateTable( "fruits", { { "fruit", "C", 15, 0 } }, oCn )

   oRs   := FW_OpenRecordSet( oCn, "fruits" )
   oRs:Sort := "id"
   for each v in { "Manzana", "Pera", "Naranja", "Mandarina", "Mango", "Banana", "Papaya", "Grape" }
      oRs:AddNew( "fruit", v )
   next

return oRs

//----------------------------------------------------------------------------//

function InsertFruit( oRs )

   local nSave := oRs:AbsolutePosition
   local nId   := oRs:Fields( "id" ):Value
   local cSql

   PRIVATE cId   := LTrim( Str( nId ) )
   PRIVATE cFruit   := PadR( "Lima", 15 )

   if !MsgGet( "Fruit Name:", "At Line : " + cId, @cFruit ) .or. Empty( cFruit )
      return nil
   endif
   cFruit   := Trim( cFruit )

   CursorWait()

TEXT INTO cSql
UPDATE fruits LEFT JOIN fruits a ON fruits.id = a.id + 1
 SET fruits.fruit = a.fruit
 WHERE fruits.id > &cId
ENDTEXT

   WITH OBJECT oRs:ActiveConnection
      :Execute( "INSERT INTO fruits ( fruit ) VALUES ( '' )" )
      :Execute( cSql )
      :Execute( "UPDATE fruits SET fruit = '&cFruit' WHERE id = &cId" )
   END
   oRs:Requery()
   oRs:AbsolutePosition := nSave
   CursorArrow()

return nil

//----------------------------------------------------------------------------//
Regards



G. N. Rao.

Hyderabad, India