Página 2 de 2

Enviado: 05 Mai 2007 00:46
por rubens
Gente, seguinte...
Aproveitando o topico.. hoje justamente estive em um cliente que quer aplicar o conceito de ativo e inativo para produtos e clientes...
Alguem pode me dar uma dica de como proceder???
Ele quer que inative o produto, mas nao remova da tabela... uso um dbedit para pesquisa de produtos na compra, venda, orcamento... se eu colocar um flag, vai ficar lento essa pesquisa (ja aqui ele nao quer que o produto apareça) mas quando ele for no cadastro/tabela de produtos tem que aparecer como inativo...
Para a tabela de consulta (dbedit) nao ficar lenta o que eu poderia fazer ???

Obrigado...

Enviado: 05 Mai 2007 01:22
por Pablo César
Caro Rubens, faça como o Eder, utilize o TBROWSE de MATRIZ caso que você precise edita ainda tais registros, fica bom dê uma olha neste tópico:

https://pctoledo.org/forum/viewto ... 9302d11cc7

Acho que você deveria utilizar um campo FLAG onde deferencie o que seria INATIVO, mas observe que você faz uma pré seleção desses registros sem utilizar filtro algum.

Agora se esses registros você vai apenas exibir em tela e não serem editados, faça uma função utilizando o SAY concatenando tais campos.

Um clip-abraço :)Pos

Enviado: 05 Mai 2007 08:46
por Poka
Olá a todos,

Interessante esse assunto, pois veio num momento em que estou fazendo justamente isso, com arquivos referente a controle bancário. Em controle bancário eu nunca permito fazer alterações, e muito menos exclusões, por motivos obvios, se o usuario precisar excluir ou alterar, tem que fazer um estorno do lançamento , e lançar novamente. Com isso o arquivo ficava muito sujo, com estornos, estornos do estornos, e por aí vai. Agora tenho um arquivo idêntico que salvo as exclusões, e qualqer alteração efetuada, tenho um campo de controle para cada registro na conta bancaria e principalmente um campo " motivo da alteração/exclusao " tendo que ser digitado pelo menos 10 caracteres", o usuario pode até preencher com "wxyxyxyuuu" , mas tem que preencher. Nesse arquivo salvo tambem a senha e o nome do usuario. Quero ver o usuário falar agora que não mexeu.

Um abraço

Poka

Enviado: 05 Mai 2007 09:36
por Maligno
Poka escreveu:Quero ver o usuário falar agora que não mexeu.
Cuidado com os usuários espertinhos que sabem usar o FoxBase. :)

[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 05 Mai 2007 10:54
por Pablo César
Poka escreveu:Quero ver o usuário falar agora que não mexeu.
Maligno escreveu:Cuidado com os usuários espertinhos que sabem usar o FoxBase. :)
É mesmo... acho que para esses casos poderia colocar mais um campo "autenticando" tal operação, digamos o uso do MD5CALC(), talvez seria essa uma boa saída Maligno ?

Um clip-abraço :)Pos

Enviado: 05 Mai 2007 11:20
por Maligno
Pablo César escreveu:É mesmo... acho que para esses casos poderia colocar mais um campo "autenticando" tal operação, digamos o uso do MD5CALC(), talvez seria essa uma boa saída Maligno ?
Sim. Ou então CRC32, que é mais leve.

[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 05 Mai 2007 19:20
por janio
rubens escreveu:Gente, seguinte...
Aproveitando o topico.. hoje justamente estive em um cliente que quer aplicar o conceito de ativo e inativo para produtos e clientes...
Alguem pode me dar uma dica de como proceder???
Ele quer que inative o produto, mas nao remova da tabela... uso um dbedit para pesquisa de produtos na compra, venda, orcamento... se eu colocar um flag, vai ficar lento essa pesquisa (ja aqui ele nao quer que o produto apareça) mas quando ele for no cadastro/tabela de produtos tem que aparecer como inativo...
Para a tabela de consulta (dbedit) nao ficar lenta o que eu poderia fazer ???

Obrigado...
1- Primeiro vc tem que criar o CAMPO na tabela de produtos... tipo FLGUSO - S (ativo) - N (inativo)

2- Depois criar uma chave no índice da tabela FLGUSO + DESCRI ... tipo

Código: Selecionar todos

         USE A03PRD EXCLUSIVE
            PACK
            INDEX ON CODIGO                              TAG CHAVE1
            INDEX ON FLGUSO + DESCRI               TAG CHAVE2
            INDEX ON DESCRI                               TAG CHAVE3
3- No Cadastro do Produto vai ser o único lugar onde vc irá mostrar TODOS OS PRODUTOS - ativos e inativos. Então para a procura do produto utilize a CHAVE 3 do índice como acima mostrado.

Código: Selecionar todos

vCODPRD = 0

@ li+02,ci+11 GET vCODPRD PICT "@E 9,999" WHEN EDITPRO() 
READ

*--------------------------------*
STATIC FUNCTION EDITPRO(PNOM,PVAR)
*--------------------------------*

PRIVATE PROCURA

PROCURA=""
MENSAGEM(lf,ci,cf,"Digite o Produto:")
@ lf-01,ci+20 SAY "                                      " COLOR('&vCOR_GET')

SAVE SCRE TO TELA

SELECT PRODUTO
DBSETORDER(3)
DBGOTOP()

declare vetcampo[5]
vetcampo[1]="DESCRI"
vetcampo[2]="UNIPRD"
vetcampo[3]="PRCMER"
vetcampo[4]="SLDSTK"
vetcampo[5]="FLGUSO"

declare vetpict[5]
vetpict[1]="@!"
vetpict[2]="@!"
vetpict[3]="@E 9,999.99"
vetpict[4]="@E 99,999.999"
vetpict[5]="!"

declare vetcab[5]
vetcab[1]="Produto"
vetcab[2]="Un"
vetcab[3]="Prc.Venda"
vetcab[4]="Estoque"
vetcab[5]="U"

KEYBOARD CHR(255)
WIN(05,02,18,78,'Produtos Cadastrados', vCOR_DBE, vCOR_DB1)
CORES(4)
dbedit(06,03,17,77,VETCAMPO,'FUNC04',vetpict,VETCAB)

restore screen from TELA
CORES(1)

IF LASTKEY() = 27
   SET KEY -1 TO EDITPRO
   SET KEY -2 to EDITPRO5
   MENSAGEM(lf,ci,cf,"<F02> PROCURA PRODUTO -- <ENTER> INCLUI NOVO PRODUTO")
   return .T. 
ENDIF

vCODPRD = PRODUTO->CODIGO 
KEYBOARD CHR(13)
RETURN .T.

*---------------*
FUNCTION FUNC04
*---------------*
PARAM A, C

local B:=LASTKEY()
Local nret := 1

B=LASTKEY()
IF A=1
   TONE(77,5)
   INKEY(.7)
ELSEIF A=2
   TONE(77,5)
   INKEY(.7)
ELSEIF A=3
   TONE(77,5)
   INKEY(.7)
ELSEIF A=4

   IF B>31 .AND. B<126 .OR. B=8

      CURSOR=SETCURSOR()
      SETCURSOR(1)
      MENSAGEM(lf,ci,cf,"Digite o Produto:")
      @ lf-01,ci+20 SAY "                                      " COLOR('&vCOR_GET')

      IF LASTKEY()=8
         TAM=LEN(PROCURA)-1
         PROCURA=SUBSTR(PROCURA,1,TAM)
         @ lf-01,ci+20 SAY "                                      " COLOR('&vCOR_GET')
      ELSE
         PROCURA+=UPPER(CHR(B))
      ENDIF

      @ lf-01,ci+20 SAY PROCURA Color('&vCOR_GET')
      DBSEEK( PROCURA,.T.)
      KEYBOARD CHR(255)
      INKEY(0)
      nret := 1
   
   ENDIF
   SETCURSOR(0)

   IF B==13
      vCODPRD = PRODUTO->CODIGO 
      PROCURA=""
      MENSAGEM(lf,ci,cf,"")
      KEYBOARD CHR(13)
      nret := 0
   ENDIF
   IF B=27
      PROCURA=""
      nret := 0
   ENDIF

ENDIF

return nret 
4- Nas outras partes do programa onde vc QUER QUE APAREÇA somente os PRODUTOS ATIVOS, use a CHAVE 2 (FLGUSO + DESCRI).

Código: Selecionar todos

vCODPRD = 0

@ li+02,ci+11 GET vCODPRD PICT "@E 9,999" WHEN EDITPRO() 
READ

*--------------------------------*
STATIC FUNCTION EDITPRO(PNOM,PVAR)
*--------------------------------*

PROCURA=""
MENSAGEM(lf,ci,cf,"Digite o Produto:")
@ lf-01,ci+20 SAY "                                      " COLOR('&vCOR_GET')

SAVE SCRE TO TELA

// aqui vc FILTRA somente os produtos ATIVOS
SELECT PRODUTO
DBSETORDER(2)
DBGOTOP()
OrdScope( 0, "S" )
OrdScope( 1, "S" )
DBGOTOP()

PRIVATE VETCAMPO[1], VETCAB[1]
VETCAMPO[1]:="DESCRI + ' ' + UNIPRD + ' ' + TRANS(PRCCOM,'@E 9,999.99') + ' ' + TRANS(PRCMER,'@E 99,999.99') + '  ' + TRANS( (PRCMER - PRCCOM) / PRCCOM * 100,'@E 999.99') + ' %' "
VETCAB[1]  :="Produto                                  Un" 

KEYBOARD CHR(255)
WIN(06,02,20,77,'Produtos Cadastrados', vCOR_DBE, vCOR_DB1)
CORES(4)
DBEDIT(07,03,19,76,VETCAMPO,"FUNC01",,VETCAB,"=")

OrdScope( 0, NIL )
OrdScope( 1, NIL )

restore screen from TELA
CORES(1)

IF LASTKEY() = 27
   MENSAGEM(lf,ci,cf,"< F02 > PROCURA PRODUTO :--: < CTRL + END > FINALIZA VENDA")
   RETURN .T. 
ENDIF

vCODPRD = PRODUTO->CODIGO 
KEYBOARD CHR(13)
RETURN(vCODPRD)

*---------------*
FUNCTION FUNC01(a)
*---------------*
local B:=LASTKEY()
Local nret := 1

B=LASTKEY()
IF A=1
   TONE(77,5)
   INKEY(.7)
ELSEIF A=2
   TONE(77,5)
   INKEY(.7)
ELSEIF A=3
   TONE(77,5)
   INKEY(.7)
ELSEIF A=4

   IF B>31 .AND. B<126 .OR. B=8

      CURSOR=SETCURSOR()
      SETCURSOR(1)
      MENSAGEM(lf,ci,cf,"Digite o Produto:")
      @ lf-01,ci+20 SAY "                                      " COLOR('&vCOR_GET')

      IF LASTKEY()=8
         TAM=LEN(PROCURA)-1
         PROCURA=SUBSTR(PROCURA,1,TAM)
         @ lf-01,ci+20 SAY "                                      " COLOR('&vCOR_GET')
      ELSE
         PROCURA+=UPPER(CHR(B))
      ENDIF

      @ lf-01,ci+20 SAY PROCURA Color('&vCOR_GET')
      
      // procura incluindo o 'S' de ativo
      DBSEEK( "S" + PROCURA,.T.)
      KEYBOARD CHR(255)
      INKEY(0)
      nret := 1 //2
   
   ENDIF
   SETCURSOR(0)

   IF B==13
      vCODPRD = PRODUTO->CODIGO 
      PROCURA=""
      MENSAGEM(lf,ci,cf,"")
      KEYBOARD CHR(13)
      nret := 0
   ENDIF
   IF B=27
      PROCURA=""
      nret := 0
   ENDIF

ENDIF

return nret 
Jânio

Enviado: 07 Mai 2007 20:36
por rubens
Nossa...

Chegou a sair fumaça nos neuronios aqui.. heheh o tico e o teco ficaram doidinhos...

Seguinte...

andei verificando o que os colegas sugeriram e achei muita areia pro meu caminhaozinho no momento.. entao decidi o seguinte com o cliente (ele quer a alteracao para o mes passado)...
criamos um flag no dbf indicando ativo/inativo...
Quando o vendedor no balcao vai fazer a venda/pedido.. o produto continuara aparacendo... mas quando for selecionado se o flag estiver em inativo mostra a mensagem de produto inativo e volta para a consulta do dbedit... para o usuario escolher outro produto...
Não é tão sofisticado quanto os colegas sugeriram mas por enquanto resolve... no cadastro de produto adicionei uma coluna no tbrowse indicando ativo ou inativo... e criei uma opcao para mostrar so os inativos...
Ainda uso ntx entao algumas sugestoes dos colegas eram iviaveis no momento...

Por enquanto já valeu pessoal, obrigado pela ajuda...