Cómo hago para registrar varios días de semana en un campo

Cómo hago para registrar varios días de semana en un campo

Postby Andrés González » Sun Oct 21, 2012 8:47 am

La cuestión que planteo se trata de tener en un solo campo los días de la semana a realizar una determinada cosa. Por ejemplo tengo unas tareas que se tienen que realizar lunes, miercoles y sabado. Quiero dejar al usuario elegir los días para que luego sean gestionados por el programa. Existe algo elegante para realizar esto y dejarlo registrado en un campo de la base de datos o tengo que poner siete campos para registrar los días a ejecutar ? Cómo lo haríais, con botones del tipo radio o hay algo mejor?


Estoy pensando en un campo de 7 dígitos, donde poner algo así: 1010010 (lunes, miercoles y sabado activos). Los 1 serian los activos y los 0 los no activos. Pero la cuestión es cómo hacer esto de forma elegante, para que el usuario solo seleccione los días y se guarde para luego saber si un día por ejemplo que sea martes sepa que no le corresponde mostrar eses dato. La segunda parte no presenta ningún problema solo la toma de datos para que los guarde en un campo me cuesta hacerlo en FW. Alguna idea?

Gracias.
Saludos

Andrés González desde Mallorca
User avatar
Andrés González
 
Posts: 627
Joined: Thu Jan 19, 2006 10:45 am
Location: Mallorca

Re: Cómo hago para registrar varios días de semana en un campo

Postby Manuel Aranda » Sun Oct 21, 2012 12:07 pm

Hola Andrés:

Pues yo lo haría tal como lo planteas, un campo alfanumérico que admita 0 y 1 para guardar los datos internamente.
Y para mostrar al usuario para su elección/visualización pues siete casillas de selección, una para cada día de la semana.
Un saludo,
Manuel

xH 1.2.3, FWH 23.07 32 bits, BC++ 7.4, xVerce CW 1.0, PellesC
User avatar
Manuel Aranda
 
Posts: 602
Joined: Wed Oct 19, 2005 8:20 pm
Location: España

Re: Cómo hago para registrar varios días de semana en un campo

Postby Andrés González » Sun Oct 21, 2012 12:53 pm

La toma de datos es lo que veo difícil o no cojo el hilo para hacerlo. Supongo que es algo que a más de uno se le ha planteado. Tu que propones hacer un RADIO con los días de la semana, pero como los paso a un solo campo. Lo que no veo es como pasar los siete campos a un solo campo cuando le doy a guardar.

Lo que pretendo hacer es coger un patrón de los días de la semana y luego dependiendo del día de la semana, me muestre o no ese dato. El problema es guardar el dato, el patrón lo tengo funcionando pero no como coger los 0 y 1.
Saludos

Andrés González desde Mallorca
User avatar
Andrés González
 
Posts: 627
Joined: Thu Jan 19, 2006 10:45 am
Location: Mallorca

Re: Cómo hago para registrar varios días de semana en un campo

Postby Marcelo Via Giglio » Sun Oct 21, 2012 3:40 pm

Andrés,

ya que los días de la semana no crecen ni disminuyen, crea 7 check

suponiendo que tienes los dias en aDias y los checks son aChecks, esta sería una idea

load:

Code: Select all  Expand view

   aChecks := ARRAY(7)
   FOR i := 1 TO LEN( aDias )
         aChecks[i] := VAL( SUBSTR( aDias,i,1) )
   NEXT
 


save:

Code: Select all  Expand view

   aDias := ''
   FOR i := 1 TO LEN( aChecks )
         aDias += STR( aChecks[i], 1, 0)
   NEXT
 


saludos

Marcelo
Marcelo Via Giglio
 
Posts: 1050
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: Cómo hago para registrar varios días de semana en un campo

Postby FranciscoA » Sun Oct 21, 2012 4:25 pm

Andrés, me ha parecido interesante lo que quieres hacer, por lo que he escrito este codigo en mi carpeta personal de samples. Pruébalo y me dices.
Hace exactamente lo que requieres; un campo alfa-numerico longitud 7, donde se guardarán los dias, por Ej., asi: 1010100 (Seleccionados Lunes,Miercoles,Viernes).
Code: Select all  Expand view

//-----------------------------------//
Function DiasHabil()
local oDlg, aoCkBx:=Array(7), alCkBx:=Array(7), lOK:=.f., n
local acDias:={"Lunes    ","Martes   ","Miercoles","Jueves   ","Viernes  ","Sabado   ","Domingo  "}

local cDias:=MiTabla->diashabil

if empty(cDias)
   cDias := "0000000"
endif

DEFINE DIALOG oDlg FROM 1,1 TO 20,70 TITLE "PRUEBA"

For n := 1 to len(alCkBx)
    alCkBx[n] := if( Substr(cDias,n,1) = "0", .f., .t. )
Next

@1, 2 CHECKBOX aoCkBx[1]  VAR alCkBx[1] OF oDlg PROMPT acDias[1]
@2, 2 CHECKBOX aoCkBx[2]  VAR alCkBx[2] OF oDlg PROMPT acDias[2]
@3, 2 CHECKBOX aoCkBx[3]  VAR alCkBx[3] OF oDlg PROMPT acDias[3]
@4, 2 CHECKBOX aoCkBx[4]  VAR alCkBx[4] OF oDlg PROMPT acDias[4]
@5, 2 CHECKBOX aoCkBx[5]  VAR alCkBx[5] OF oDlg PROMPT acDias[5]
@6, 2 CHECKBOX aoCkBx[6]  VAR alCkBx[6] OF oDlg PROMPT acDias[6]
@7, 2 CHECKBOX aoCkBx[7]  VAR alCkBx[7] OF oDlg PROMPT acDias[7]

@7,02 BUTTON "Aceptar"  OF oDlg ACTION ( lOK := .t., oDlg:End() ) SIZE 40,12
@7,12 BUTTON "Cancelar" OF oDlg ACTION ( lOK := .f., oDlg:End() ) SIZE 40,12

ACTIVATE DIALOG oDlg CENTERED

if lOK
   if MiTabla->(DbRLock())
      cDias:=""

      For n := 1 to len(alCkBx)
         cDias += if( alCkBx[n], "1","0" )
      Next

      MiTabla->DiasHabil := cDias
      MiTabla->(DbCommit())
      MiTabla->(DbUnlock())
   endif
endif

Return nil
 


Saludos.
Last edited by FranciscoA on Mon Oct 22, 2012 12:31 pm, edited 2 times in total.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2110
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Cómo hago para registrar varios días de semana en un campo

Postby carlos vargas » Sun Oct 21, 2012 5:42 pm

yo tengo parecido pero es para seleccionar permisos para usaurios, seria cambiarlos por los dias de la semana
almacena los datos en un arreglo en un ca<mpo numerico o de caracter.
Code: Select all  Expand view

STATIC PROCEDURE Usuarios_Permisos()
   LOCAL lGrabar := FALSE
   LOCAL oError
   LOCAL cModulo, x

   PRIVATE oDlgMod, oBrwM
   PRIVATE aModulos1 := {}
   PRIVATE aModulos2 := {}

   AAdd( aModulos1, { FALSE, "C_CLIENTES",    "Catalogo de clientes"              } )
   AAdd( aModulos1, { FALSE, "D_PRESTAMO",    "Detalle de prestamo"               } )
   AAdd( aModulos1, { FALSE, "P_PRESTAMOS",   "Programación de prestamos"         } )
   AAdd( aModulos1, { FALSE, "R_DESEMBOLSO",  "Registro de desembolsos"           } )
   AAdd( aModulos1, { FALSE, "C_APERTURA",    "CAJA->Apertura de caja"            } )
   AAdd( aModulos1, { FALSE, "C_DESEMBOLSO",  "CAJA->Desembolso de prestamo"      } )
   AAdd( aModulos1, { FALSE, "C_DIFERIDO",    "CAJA->Abono en oficina"            } )
   AAdd( aModulos1, { FALSE, "C_FLUJO",       "CAJA->flujo de efectivo por ruta"  } )
   AAdd( aModulos1, { FALSE, "C_OTROS",       "CAJA->Otros movimientos"           } )
   AAdd( aModulos1, { FALSE, "C_COMPRA",      "CAJA->Comprar dolares"             } )
   AAdd( aModulos1, { FALSE, "C_VENTA",       "CAJA->Venta dolares"               } )
   AAdd( aModulos1, { FALSE, "C_TASA",        "CAJA->Tasa de cambio"              } )
   AAdd( aModulos1, { FALSE, "R_COBRO",       "Registro de cobro por ruta"        } )
   AAdd( aModulos1, { FALSE, "R_FINANCIEROS", "Reportes financieros"              } )
   AAdd( aModulos1, { FALSE, "T_USUARIOS",    "TABLAS->Usuarios y permisos"       } )
   AAdd( aModulos1, { FALSE, "T_PLAZOS",      "TABLAS->Plazos de pagos"           } )
   AAdd( aModulos1, { FALSE, "T_FERIADOS",    "TABLAS->Feriados"                  } )
   AAdd( aModulos1, { FALSE, "T_ZONAS",       "TABLAS->Zonas"                     } )
   AAdd( aModulos1, { FALSE, "T_CIUDADES",    "TABLAS->Ciudades"                  } )
   AAdd( aModulos1, { FALSE, "T_COBRADORES",  "TABLAS->Cobradores"                } )
   AAdd( aModulos1, { FALSE, "T_GESTORES",    "TABLAS->Gestores"                  } )
   AAdd( aModulos1, { FALSE, "T_RUTAS",       "TABLAS->Rutas de cobro"            } )
   AAdd( aModulos1, { FALSE, "T_REORGANIZAR", "TABLAS->Reorganizar datos"         } )

   aModulos2 := StringToArray( USUA->MODULOS )

   FOR EACH cModulo IN aModulos2
      nPos := AScan( aModulos1, {|aItem| aItem[ 2 ] == cModulo } )
      IF nPos > 0
         aModulos1[ nPos, 1] := TRUE
      ENDIF
   NEXT

   DEFINE DIALOG oDlgMod NAME "DLG_USUARIOP" OF oDlg ICON GetIcon() FONT oFontD

   REDEFINE SAY PROMPT ( "Accesos de " + RTrim( USUA->NOMBRE ) ) ID 101 OF oDlgMod COLOR CLR_WHITE, CLR_BLUE

   REDEFINE XBROWSE oBrwM ID 102 OF oDlgMod ;
         COLUMNS 1, 3 ;
         HEADERS "Permitir", "Descripción de modulo" ;
         SIZE 100, 150 ;
         ARRAY aModulos1 ON DBLCLICK Usuarios_CambiaAcceso() FONT oFontD

   oBrwM:MyConfig()
   oBrwM:aCols[ 1 ]:SetCheck( { "BMS_CHECKON", "BMS_CHECKOFF" } )
   oBrwM:bKeyDown := {|nKey| IIf( nKey==VK_RETURN .or. nKey==VK_SPACE, Usuarios_CambiaAcceso(), NIL ) }

   REDEFINE BUTTON ;
      ID 201 OF oDlgMod ;
      ACTION ( lGrabar := TRUE, oDlgMod:end() )

   REDEFINE BUTTON ;
      ID 202 OF oDlgMod ;
      ACTION ( lGrabar := FALSE, oDlgMod:end() )

   ACTIVATE DIALOG oDlgMod

   IF lGrabar
      aModulos2 := {}
      FOR x := 1 TO Len( aModulos1 )
         IF aModulos1[ x, 1 ] == TRUE
            AAdd( aModulos2, aModulos1[ x, 2 ] )
         ENDIF
      NEXT
      TRY
         AdsBeginTransaction()
         IF USUA->( DBLockRec() )
            USUA->MODULOS := Val2PrgExp( aModulos2 )
         ENDIF
         AdsCommitTransaction()
      CATCH oError
         AdsRollBack()
         ShowError( oError )
      END
      RecordsUnLock( "USUA" )
      MsgInfo( "Permisos actualizados!" )
   ENDIF

   oBrw:SetFocus()

RETURN
 


Code: Select all  Expand view


FUNCTION Val2PrgExp( xVal )
   LOCAL cType := ValType( xVal )
   LOCAL aVar, cRet

   SWITCH cType

   CASE 'C'
      IF !( '"' IN xVal )
         RETURN '"' + xVal + '"'
      ELSEIF !( "'" IN xVal )
         RETURN "'" + xVal + "'"
      ELSEIF ( ! "[" IN xVal ) .AND. ( ! "]" IN xVal )
         RETURN "[" + xVal + "]"
      ELSE
         Throw( ErrorNew( "VAL2PRGEXP", 0, 3102, ProcName(), "No se puede convertir a cadena", { xVal } ) )
         EXIT
      ENDIF
   CASE 'D'
      RETURN "STOD( '" + dToS( xVal ) + "' )"
   CASE 'L'
      RETURN IIF( xVal, ".T.", ".F." )
   CASE 'N'
      RETURN Ltrim( Str( xVal ) )
   CASE 'A'
      cRet := "{"
      FOR EACH aVar IN xVal
         cRet += ( Val2PrgExp( aVar ) + "," )
      NEXT
      IF cRet[ -2 ] == ','
         cRet[ -2 ] := ''
      ENDIF
      cRet[ -1 ] := '}'
      RETURN cRet
   DEFAULT
      IF xVal == NIL
         cRet := "NIL"
      ELSE
         Throw( ErrorNew( "VAL2PRGEXP", 0, 3103, ProcName(), "Tipo no soportado", { xVal } ) )
      ENDIF
   END

RETURN cRet

/*-------------------------------------------------------------------------------------------------*/

FUNCTION StringToArray( cString )
   LOCAL aArray := {}
   LOCAL oError := NIL

   IF !Empty( cString )
      cString := AllTrim( cString )
      TRY
         IF Left( cString, 1 ) == "{" .and. Right( cString, 1 ) == "}"
            aArray := &( cString )
            IF !HB_IsArray( aArray )
               aArray := {}
            ENDIF
         ENDIF
      CATCH oError
         aArray := {}
      END
   ENDIF

RETURN aArray

/*-------------------------------------------------------------------------------------------------*/

PROCEDURE Usuarios_CambiaAcceso()
   LOCAL nPos := Eval( oBrwM:bKeyNo )

   IF nPos > 0
      aModulos1[ nPos, 1 ] := !aModulos1[ nPos, 1 ]
   ENDIF
   oBrwM:RefreshCurrent()

RETURN

 
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1687
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Cómo hago para registrar varios días de semana en un campo

Postby Manuel Aranda » Sun Oct 21, 2012 5:58 pm

Hola de nuevo, Andrés:

No se trata de RADIOs sino de CHECKBOX.

Te pongo un ejemplillo de como lo hago:

Code: Select all  Expand view


Local cSemana:= Datos->Semana  //Campo alfanumérico de 7 posiciones
Local lDia:=Array(7)
Local oDia
Local n:= 1
//
WHILE n < 8
  ldia[n] = SUBSTR(cSemana,n,1)
  //
  IF ldia[n] = "S"
     ldia[n]  = .T.
  ELSEIF ldia[n] = "N"
     ldia[n] = .F.
  ELSEIF ldia[n] = " "
     ldia[n] = .F.
  ENDIF
  //
  n=n+1
  //
END WHILE
//
REDEFINE CHECKBOX oDia[1]  VAR lDia[1]  ID 901 OF oDlg  // WHEN .F. para desactivar esta checkbox
REDEFINE CHECKBOX oDia[2]  VAR lDia[2]  ID 902 OF oDlg
REDEFINE CHECKBOX oDia[3]  VAR lDia[3]  ID 903 OF oDlg
REDEFINE CHECKBOX oDia[4]  VAR lDia[4]  ID 904 OF oDlg
REDEFINE CHECKBOX oDia[5]  VAR lDia[5]  ID 905 OF oDlg
REDEFINE CHECKBOX oDia[6]  VAR lDia[6]  ID 906 OF oDlg
REDEFINE CHECKBOX oDia[7]  VAR lDia[7]  ID 907 OF oDlg
//

//Para grabar los datos en el campo Semana

n:= 1
WHILE n < 8
   //
   IF ldia[n] = .T.
      ldia[n] = "S"
   ELSEIF ldia[n] = .F.
      ldia[n] = "N"
   ENDIF
      //
     cSemana=ALLTRIM(cSemana)+lDia[n]
     n=n+1
 END WHILE
  //
  Datos->Semana = cSemana
  //
 RETURN NIL
 
 
Un saludo,
Manuel

xH 1.2.3, FWH 23.07 32 bits, BC++ 7.4, xVerce CW 1.0, PellesC
User avatar
Manuel Aranda
 
Posts: 602
Joined: Wed Oct 19, 2005 8:20 pm
Location: España

Re: Cómo hago para registrar varios días de semana en un campo

Postby Andrés González » Mon Oct 22, 2012 3:18 pm

Gracias Manuel, Carlos y Francisco, esas opciones ya las había contemplado. El problema me temo que recae en el momento de guardar los datos, así siempre necesito una postfunción que me guarde los datos en el campo y una prefunción cuando quieras modificarlo, todo sea dicho también lo puedes solucionar con un botón de seleccionar los días a ejecutar que al volver te actualice el campo como vuestros ejemplos, pero nunca se puede emplear para cargar y modificar el campo en tiempo de ejecución. La verdad no me refería a esto, supongo que pensaba en un control tipo switch, mirar el ejemplo switchst.prg, con los que modificar un determinado bit o "carácter" del campo. Cuando pulsas sobre uno de los siete tendría que actuar como encendido y apagado solamente de ese bit y modificar ese bit o "carácter" en el campo, para luego ser guardado sin tener que transformarlo. No se si harbour permite pasar un trozo de la variable campo tipo TABLA->CAMPO[1] sabiendo que es de siete posiciones, tendríamos siete posiciones de un solo campo. Vamos hablo hipotéticamente, ya que aun no he mirado si se puede. Pero vamos, seguro que a más de uno de los gurus se le habrá planteado este problema.Y, me daría igual si es 0 ó 1 o T o F.
Saludos

Andrés González desde Mallorca
User avatar
Andrés González
 
Posts: 627
Joined: Thu Jan 19, 2006 10:45 am
Location: Mallorca

Re: Cómo hago para registrar varios días de semana en un campo

Postby sysctrl2 » Mon Oct 22, 2012 10:55 pm

Yo crearia 7 campos logicos en la tabla , lun, mar, mie, juv, vie, sab, dom

y montar los campos en un xbrowse, con check.

saludos.
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
sysctrl2
 
Posts: 951
Joined: Mon Feb 05, 2007 7:15 pm

Re: Cómo hago para registrar varios días de semana en un campo

Postby nnicanor » Tue Oct 30, 2012 3:25 pm

Hola,

Puedes hacer un campo memo (Text) donde guardas el dato correspondiente al dia como una lista, y te vales de la funcion listasarray para leerlo y convertirlo en un array

Code: Select all  Expand view

cListaDias := ""

aDias := {"1","3","6","7"}

// convertilo en una lista
For x:= 1 to len( aDias )
   
     cListaDias := cListaDias +iif(x>1 ",","")+aDias [x]  
 
Next

Alias->DiasSel := cListadias

// Leerlo de la tabla y convertirlo en array

aDias := ListAsArray( Alias->DiasSel,",")


 


Slds
Nicanor Martinez M.
Auditoria y Sistemas Ltda.
MicroExpress Ltda.
FW + FWH + XHARBOUR + HARBOUR + PELLES C + XDEVSTUDIO + XEDIT + BCC + VC_X86 + VCC_X64 + MINGW + R&R Reports + FastReport + Tdolphin + ADO + MYSQL + MARIADB + ORACLE
nnicanor@yahoo.com
nnicanor
 
Posts: 295
Joined: Fri Apr 23, 2010 4:30 am
Location: Colombia

Re: Cómo hago para registrar varios días de semana en un campo

Postby gimson » Wed Dec 05, 2012 10:18 am

La forma más simple es que el día sea una potencia de dos y sumarlos.

1->lunes, 2->martes, 4-> miércoles, 8->jueves, 16->viernes, 32-> sábado, 64->domingo

Si quieres que se aplique lunes y martes guardas un 5.
Y con un solo numero sabes cualquier combinación de días

Espero que te sirva. Un saludo.
gimson
 
Posts: 1
Joined: Wed Dec 05, 2012 9:45 am

Re: Cómo hago para registrar varios días de semana en un campo

Postby MarioG » Wed Dec 05, 2012 12:27 pm

Gimson;
Aclarame la idea: Como lo represento, visualmente, que una sumatoria corresponde a Tal/tales dias?. Suponiendo que lo mostramos en un Dialog con Chekboxs; al editar por ej un 14, como aparecen "tildados", martes, miercoles y jueves?

gracias
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: Cómo hago para registrar varios días de semana en un campo

Postby Armando » Wed Dec 05, 2012 8:23 pm

Mario:

A ver si entendí la excelente idea de gimson:

1.- Tomas el valor guardado en el campo, en tu ejemplo vale 14 (2+4+8 por Martes,Míercoles y Jueves)
2.- Lo divides entre 64, el resultado deberá ser 0 o 1 y corresponde al día Domingo, 0=Apagado 1=Encendido
3.- Obtienes el residuo de la división, que en este ejemplo sigue siendo 14

4.- El residuo lo divides entre 32, este resultado, que en etse ejemplo es 0, te determinará el día Sábado
5.- Obtenes el residuo, y sigue siendo 14.

6.- El residuo (14) lo divides entre 16, este resultado te determina el valor del día Viernes
7.- Obtienes el residuo, sigue siendo 14

8.- Ahora el residuo lo divides entre 8, este resultado (1) te determina el valor del día Jueves, Activo
9.- Obtienes el residuo que siguiendo el ejemplo debe ser 6

10.- Ahora lo divides entre 4, este resultado (1) te determina el valor del dia Míercoles, Activo
11.- Obtienes el residuo 2 en nuestro ejemplo

12.- Lo divides entre 2, este resultado (1) te determina el valor del día Martes, Activo
13.- Obtienes el residuo, cero en este caso, y este es el valor del día Lunes, Inactivo

Creo que con esto debe funcionar

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
User avatar
Armando
 
Posts: 3061
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Cómo hago para registrar varios días de semana en un campo

Postby MarioG » Wed Dec 05, 2012 10:30 pm

Gimson... IM PRE SIO NAN TE ! :-)
Armando, gracias!. Amo las matemáticas, aunque mi RAM me esta quedando chica ;-)
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 68 guests