Actualizar todos los registros de una columna de una tabla dbf

260 views
Skip to first unread message

integral

unread,
Jun 10, 2023, 7:06:24 PM6/10/23
to Comunidad de Visual Foxpro en Español

Estimados Amigos

Tengo un campo en una tabla dbf llamado Hora_Con que se llena con el comando Time(). Ej. 12:25:45
Pero ahora estoy tratando de modificar todos los registros de dicha columna con un formato de Hora reducido Ej:  12:25 p.m.

Aqui el codigo que estoy utilizando pero no actualiza todos los registros tan solo el primer registro

Use Consumo                                                        , 
BROWSE NOMODIFY TIMEOUT 1

Temp_Condi = 1 

SCAN
 cTiempo = Substr(Hora_Con,1,5)
 cTimeLet = IIF(Substr(Str(VAL(Hora_Con),2),1,2) < "13"," a.m.", " p.m.")
 Condicion  = cTiempo + cTimeLet

    UPDATE Consumo ;
           SET hora_con = m.Condicion ;          
           WHERE registro = m.Temp_Condi

  Temp_Condi = Temp_Condi + 1
  STORE Hora_Con TO Condicion

ENDSCAN

Agradezco sus comentarios y sugerencias...

Atte.

Integral

PD : LA TABLA ES EXTRAIDA DEL SQL SERVER PARA POSTERIORMENTE HACER AHI LA ACTUALIZACION... 

Ricardo Soldini

unread,
Jun 10, 2023, 7:52:26 PM6/10/23
to Comunidad de Visual Foxpro en Español
fijate que valor toma 'registro'  quizas deberias asignar registro=recno() 
o si no 
usa este esquema
select consumo
scan
cTiempo = Substr(Hora_Con,1,5)
 cTimeLet = IIF(Substr(Str(VAL(Hora_Con),2),1,2) < "13"," a.m.", " p.m.")
 Condicion  = cTiempo + cTimeLet
replace   hora_con with  m.Condicion
STORE Hora_Con TO Condicion
endscan
Message has been deleted

Trento

unread,
Jun 10, 2023, 10:13:01 PM6/10/23
to Comunidad de Visual Foxpro en Español
lcHORA = "11:30:53"
? IIF( LEFT( lcHORA, 2 ) < "12", ;
   LEFT( lcHORA, 5 ) + " a.m.", ;
   PADL( TRANSFORM( ( VAL( LEFT( lcHORA, 2 ) ) - 12 ) ), 2, "0" ) + ;
SUBSTR( lcHORA, 3, 3 ) + " p.m." )

* Mostraría "11:30 a.m."

lcHORA = "17:15:25"
? IIF( LEFT( lcHORA, 2 ) < "12", ;
   LEFT( lcHORA, 5 ) + " a.m.", ;
   PADL( TRANSFORM( ( VAL( LEFT( lcHORA, 2 ) ) - 12 ) ), 2, "0" ) + ;
SUBSTR( lcHORA, 3, 3 ) + " p.m." )

* Mostraría "05:25 p.m."

Y nada, que con eso ya te puedes hacer una función que reciba como parámetro el valor de la función TIME()


Saludos.
Message has been deleted

integral

unread,
Jun 11, 2023, 12:14:14 AM6/11/23
to Comunidad de Visual Foxpro en Español
Amigo 
Ricardo

Efectivamente tal cual tu ejemplo con el comando Replace si Funciona perfectamente...

Pero lo intento con el comando Update y no logro el resultado...

Por ahi lei  que con el Update de VFP solo se puede  actualizar un registro. Si al ejemplo que expuse le quito el Where me repite la hora del primer registro igual en toda la columna de Hora_Con al igual si utilizo..

   Where !Empty(Hora_Con)

PD : A este codigo obtenido lo tengo que modificar para que funcione con la tabla Consumo de SQL Server 2008r2

Saludos,

Integral 

Víctor Hugo Espínola Domínguez

unread,
Jun 11, 2023, 2:56:24 PM6/11/23
to publice...@googlegroups.com
Algunas observaciones sobre el tema planteado:
1)  Estás mezclando 2 técnicas de programación RBAR con SQL https://www.devonblog.com/continuous-delivery/unlock-true-potential-of-sql-server-by-avoiding-rbar-programming/#:~:text=What%20does%20'Row%20by%20AGONIZING,examples%20of%20known%20RBAR%20programming.
Scan/EndScan y Do while not eof() son cicloss para procesar fila x fila  y Update es para procesar columnas, en resumen no se debe usar Update dentro de un ciclo, UPDATE y la cláusula WHERE son suficientes para actualizar columnas en las filas que que cumplan la condición del where
2) Dices que quieres implementar un formato reducido, pero lo único que lograrás es reducir la precisión de los datos, incluso si redondeas los minutos de acuerdo al valor de los segundos, prueba estas sentencias:
? Len("01:23:55")
? Len("01:23 P.M.")
? Len("01:23 PM")
? Len("01:23PM")
3) El formato hh:mm:ss ocupa 8 bytes y la precisión es a nivel de segundos, puedes ahorrar 3 bytes usando Numeric(5) y guardando Round(Seconds(),0) o Sys(2) o  Datetime() - Datetime(Year(Date()), Month(Date()), Day(Date()), 0, 0, 0)
4) Si aún persiste en tu idea, ahí va el código:

Create Cursor Consumo (Hora_Con C(8))

Insert Into Consumo Values ("00:11:22")
Insert Into Consumo Values ("11:22:33")
Insert Into Consumo Values ("12:34:56")
Insert Into Consumo Values ("23:45:43")

Browse

Update  Consumo ;
Set Hora_Con = Time2HhMmAP(Hora_Con)

Browse


*
*-----------------------------------------------------------------------------------
*
Function Time2HhMmAP(tcTime As String) As String

Local lcDateTime As String ;
    , lcHhMmAMPM As String ;
    , lcTimeAMPM As String ;
    , lnSeconds  As Number ;
    , lnSetHours As Number

lnSetHours = Set("Hours")

Set Hours To 12

lnSeconds  = Val(m.tcTime) * 3600 + Val(Substr(m.tcTime, 4)) * 60 + Val(Substr(m.tcTime, 7))
lcDateTime = Dtot(Date()) + m.lnSeconds
lcTimeAMPM = Ttoc(m.lcDateTime, 2)
lcHhMmAMPM = Stuff(m.lcTimeAMPM, 6, 4, "") && También puedes usar 3 en vez de 4

Set Hours To m.lnSetHours

Return m.lcHhMmAMPM

Endfunc


Saludos,
Víctor.
Lambaré - Paraguay.



--
Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/58143e00-d936-43ec-92ea-6bc3c5496f69n%40googlegroups.com.

Ricardo Soldini

unread,
Jun 11, 2023, 10:27:16 PM6/11/23
to Comunidad de Visual Foxpro en Español
EL Update va de  la mano del Where <condicion>  por que sino afecta atodos los registro
por eso debes tener una condicion unica para que afecte solo a los registros que necesites
 
en este caso  te sugeri que revisaras que valor toma "registro"  ya que al parecer "registro" esta fijo y siempre actualiza el mismo registro

prueba con registro = recno() 

  Temp_Condi = 1 
select consumo

SCAN
 cTiempo = Substr(Hora_Con,1,5)
 cTimeLet = IIF(Substr(Str(VAL(Hora_Con),2),1,2) < "13"," a.m.", " p.m.")
 Condicion  = cTiempo + cTimeLet
   registro = recno()

    UPDATE Consumo ;
           SET hora_con = m.Condicion ;          
           WHERE registro = m.Temp_Condi

  Temp_Condi = Temp_Condi + 1
  STORE Hora_Con TO Condicion

ENDSCAN

Ramon-México

unread,
Jun 11, 2023, 11:54:28 PM6/11/23
to Comunidad de Visual Foxpro en Español


SET HOURS TO 12
replace all consumo.hora_con with CTOT( consumo.hora_con  )

Esteban Herrero

unread,
Jun 12, 2023, 3:50:58 PM6/12/23
to publice...@googlegroups.com

No entiendo xq usar dentro de un Scan un Update, cuando vas moviendo de registro en registro, q mejor q usar un replace.

Xq complicar algo q es tan simple de resolver...

--
Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.

integral

unread,
Jun 12, 2023, 6:36:58 PM6/12/23
to Comunidad de Visual Foxpro en Español
Que tal Amigos

La tabla original esta creada en SQL Server 2008r2. Entonces el campo llamado Hora_Con que se llena con el comando Time(). Ej. 12:25:45
Ahora estoy tratando de modificar todos los registros de dicha columna con un formato de Hora reducido Ej:  12:25 p.m.

 El siguiente codigo funciona. Para tal efecto sustraje como prueba la tabla dbo.Consumo a Consumo.dbf 

       WAIT WINDOW "Iniciando el Proceso..." TIMEOUT .5 

SCAN
 cTiempo = Substr(Hora_Con,1,5)
 cTimeLet = IIF(Substr(Str(VAL(Hora_Con),2),1,2) < "13"," a.m.", " p.m.")
 Condicion  = cTiempo + cTimeLet
 replace   hora_con with  m.Condicion

 STORE Hora_Con TO Condicion
ENDSCAN
WAIT WINDOW "[ Proceso Terminado ]" TIMEOUT .5
USE

En SQL Server vengo utilizando el comando Update pero en la rutina que les muestro no funciona correctamente, toma el dato de la primera fila y lo repite en toda la columna.

Algun conocedor que me oriente a como cambiar la rutina para que funcione correctamente en SQL Server 2008r2

Gracias por su atencion

Atte.,

Integral

Gerardo Cagnola

unread,
Jun 12, 2023, 10:17:50 PM6/12/23
to publice...@googlegroups.com
si haces un replace dentro de un scan puede pasar cualquier cosa
ya te contestaron sobre eso "No entiendo xq usar dentro de un Scan un Update, cuando vas moviendo de registro en registro, q mejor q usar un replace."
hacé directamente el update en la base...
deberías leer sobre sql server: update, hour, etc...

Miguel Antúnez

unread,
Jun 13, 2023, 9:41:24 AM6/13/23
to publice...@googlegroups.com
Si solo es un tema de formato, para que necesitas actualizarlo,
revisa este comando "FORMAT"

ejemplo:
SELECT FORMAT (getdate(), 'hh:mm:ss tt') as date

Saludos.





--
Miguel Angel Antúnez Camones
mant...@gmail.com

integral

unread,
Jun 13, 2023, 1:07:15 PM6/13/23
to Comunidad de Visual Foxpro en Español
Que tal amigo Antunez

Adjunto el link del comando que mencionas, aplica a partir de SQL Server 2012

Saludos,

Integral

Miguel Antúnez

unread,
Jun 13, 2023, 3:36:58 PM6/13/23
to publice...@googlegroups.com
Hola Integral, no me había percatado de tu versión de SQLServer, en el link que envías dice que puedes hacer lo con convert.

select convert(varchar(15),cast('08:00:00.0000' as time),100)

Saludos.



mpulla

unread,
Jun 13, 2023, 5:50:09 PM6/13/23
to Comunidad de Visual Foxpro en Español
Hola integral.

Que tipo de campo es Hora_Con?

si es time y solo presentación puedes hacer 
select *, convert(varchar(15),  Hora_Con , 0) from mitabla;

Saludos.
Mauricio

integral

unread,
Jun 14, 2023, 12:09:36 AM6/14/23
to Comunidad de Visual Foxpro en Español
Gracias amigos por sus comentarios y sugerencias.

Tema Resuelto

Saludos,

Integral
Reply all
Reply to author
Forward
0 new messages