Os exemplos a seguir são segmentos de programas reais e portanto são meramente ilustrativos (não é o programa completo, é só para exemplificar).
Consulta de dados. Utiliza uma função personalizada quando o usuário tecla [Enter] para mostrar os vencedores e participantes da licitação. Teclas [Insert] e [Delete] estão desabilitadas neste exemplo.
Possui colunas criadas por funções personalizadas.
aTITU := {"PROCESSO", "OBJETO", "SITUAÇÃO", "DATA", "SESSÃO", "HORA"} aCAMP := {"LIC(MODALIDADE,NUMERO,COMPL,ANO)", "OBJETO", "SITUA(TRESULTADO)", "INICIO", "SESSAO", "SESSAOHORA"} aMASK := {"@!","@!S62",,,,,,,,} abROT := { {|| UNPLUGGED()}, {|| MOSTRALIC()}, {|| UNPLUGGED()}, {|| UNPLUGGED()}} NAVEGAR(02,00,22,MAXCOL(), "TODOS OS PROCESSOS LICITATÓRIOS",,,; aTITU, aCAMP, aMASk,; abROT) FUNCTION UNPLUGGED() // ESSA FUNÇÃO NÃO FAZ NADA MESMO, SERVE PARA DESABILITAR A FUNÇÃO PADRÃO RETURN
Esse exemplo usa VALIDAÇÃO. Só cadastra CPF se for válido.
ABREDBF("RESPONSA", "RSP") aTITU := {"NOME", "CPF" , "POSSE", "SAÍDA"} aCAMP := {"NOME", "CPF" , "POSSE", "SAIDA"} aMASK := {"@!", "@R 999.999.999-99", , } aVALID:= {".T.", "CGC(CPF)" , ".T." , ".T." } NAVEGAR(02,00,22,79, "RESPONSÁVEL DO SETOR DE LICITAÇÃO PELAS CONTRATAÇÕES DIRETAS",,,; aTITU, aCAMP, aMASk, , aVALID) // Essa função CGC() encontra-se no programa EXTRAS.PRG que acompanha NAVEGAR.PRG
Esse exemplo usa máscaras; VALID; WHEN e rotinas personalizadas:
aTITU := {"CNPJ", "RAZÃO SOCIAL","ITEM/LOTE","CONTRATADO R$", "EMPENHO","ODC/ODS/OS", "No.",; "ASSINATURA", "CONTRATO", "VENCIMENTO", "PUB. EXTRATO"} aCAMP := {"CNPJ", "IIF ( EMPTY(CRC->RAZAO), 'NÃO CADASTRADA'+SPACE(26), CRC->RAZAO)",; "ITEMLOTE", "CONTRATADO", "EMPENHO","TIPO", "CONTRATO", "VIGEINI", "CTR", "VIGEFIM", "EXTRATOCTR"} aMASK := {"@R 99.999.999/9999-99",; "@!S45", ,"@E 999,999,999.99","@!",,"@R 999/99",,"@R 999/99",,} aVALID:= {".T.", ".T." , ".T.", ".T.", ".T." ,"TIPOCTR(getactive():buffer)", "CTR(getactive():buffer)", "DATA1(getactive():buffer)", ".T.", "CTOD(getactive():buffer)>=EMP->VIGEINI .OR. EMPTY(CTOD(getactive():buffer)) .OR. EMPTY(EMP->VIGEINI)" , ".T." } aWHEN := {".T.", "EMPRESA(CRC->RAZAO)", ".T.", ".T.", EMP->CONTRATADO>0, "EMP->CONTRATADO>0" , "EMP->CONTRATADO>0" , "EMP->CONTRATADO>0" , "EMP->CONTRATADO>0" , "EMP->CONTRATADO>0", "EMP->CONTRATADO>0" } abROT := { {|| EMP->(INSPARTS(oTBRX, aCAMP,,, aMASK, aVALID, aTITU, aWHEN, .T. ))} } NAVEGAR(09,00,22,79, cTITULO,,,; aTITU, aCAMP, aMASk,; abROT, aVALID, aWHEN,,,.T., aMESSAGE)
Agora vai ficando quente!...
Esse exemplo usa função de inserção personalizada aproveitando a funções de NAVEGAR(). Também usa uma função especial para preencher o campo 'garantia'.
// [...] aGARANTIAS := {'CAUÇÃO',; 'FIANÇA BANCÁRIA',; 'SEGURO GARANTIA'} // [...] // ÍNDICE QUE FILTRA REGISTROS DESSE CONTRATO SELECT GRT cRANDOM2 := ALLTRIM(STR(RAN(9999))) // RAN() É UMA FUNÇÃO QUE GERA NÚMEROS ALEATÓRIOS fINDEX2 := xTEMP+"TEMP" + cRANDOM INDEX ON RIGHT(CTR,2)+LEFT(CTR,3)+DTOS(EMISSAO) TAG TMP2 TO (fINDEX2); FOR CTR=ALLTRIM(EMP->CTR) ; // FILTRA CONTRATO SELECIONADO (EMP->CTR) ADDITIVE TEMPORARY // [...] // GARANTIAS aMESSAGE2 := {"Data de emissão da garantia",; "Modalidades de Garantia válidas: CAUÇÃO, FIANÇA BANCÁRIA ou SEGURO GARANTIA.",; "Valor da garantia",; "Data de início da cobertura da garantia",; "Data do fim da cobertura da garantia"; } aTITU2 := {"EMISSÃO", "MODALIDADE", "R$ VALOR", "INÍCIO", "FIM"} aCAMP2 := {"EMISSAO", "MODALIDADE", "VALOR" , "INICIO", "FIM"} aMASK2 := { , "@!" , "@E 999,999,999.99",; , , , , , , } aVALID2:= {".T." ,"getactive():buffer $ aGARANTIAS"; , ".T." , ".T." , ".T."} aWHEN2 := {".T." ,"GARANTIA(MODALIDADE)"; , ".T." , ".T." , ".T."} bF2PRN := {|| PRNTA() } // TECLA F2 IMPRIME FICHA DO CONTRATO // FUNÇÃO ESPECIAL P/ INSERIR REGISTROS abROT2 := { {|| INGRT(oTBRX,aCAMP2,aMASK2,aWHEN2,aTITU2,aMESSAGE2, aVALID2)} } // CHAMADA DA FUNÇÃO NAVEGAR() SELECT GRT NAVEGAR(29,00,39,79, "GARANTIAS DO CONTRATO Nº "+TRANSFORM(cCTR, "@R 999/99"),,,; aTITU2, aCAMP2, aMASk2,; abROT2, aVALID2, aWHEN2,,bF2PRN,.T., aMESSAGE2) FUNCTION INGRT(oTBRX,aCAMP,aMASK,aWHEN, aTITU, aMESSAGE, aVALID) // FUNÇÃO ESPECIAL P/ INSERIR REGISTROS DBGOBOTTOM() // MOVE P/ ULTIMA LINHA oTBRX:COLPOS := 1 // MOVE P/ PRIMEIRA COLUNA IF !EMPTY(aMESSAGE) MSGM(aMESSAGE[oTBRX:COLPOS]) // FUNÇÃO PARA MOSTRAR MENSAGENS DE PREENCHIMENTO DOS CAMPOS ENDIF oTBRX:ROWPOS := oTBRX:ROWCOUNT // ULTIMA LINHA DA TABELA oTBRX:REFRESHALL() // BANCO DE DADOS ESTÁ INDEXADO oTBRX:FORCESTABLE() // ATUALIZA TBROWSE oTBRX:CONFIGURE() // SOLICITA ATUALIZACAO TBROWSE *** INSERE NOVO REGISTRO EM BRANCO DBAPPEND() // INSERE NÚMERO DO CONTRATO E DATA ATUAL AUTOMATICAMENTE // NESSE BROWSE SÓ QUEREMOS CADASTRAR GARANTIAS DESSE CONTRATO // PRECISAMOS INSERÍ-LO PARA QUE ELE APAREÇA, POIS FILTRA O CONTRATO ATUAL NO ARQUIVO DE ÍNDICE (INDEX). REPLACE CTR WITH ALLTRIM(EMP->CTR),; EMISSAO WITH DATE() oTBRX:REFRESHALL() // BANCO DE DADOS ESTÁ INDEXADO oTBRX:FORCESTABLE() // ATUALIZA TBROWSE oTBRX:CONFIGURE() // SOLICITA ATUALIZACAO TBROWSE // ROTINA DE INSERÇÃO DE REGISTROS DA FUNÇÃO NAVEGAR() INSERIR(oTBRX,aCAMP,,,aMASK,aVALID,aTITU,aWHEN,.T.,aMESSAGE) // FUNÇÃO DA FUNÇÃO NAVEGAR() oTBRX:REFRESHCURRENT() // SOLICITA ATUALIZACAO TBROWSE oTBRX:FORCESTABLE() // ATUALIZA TBROWSE RETURN FUNCTION GARANTIA(cBUFFER) nRR2 := ROW()+LEN(aGARANTIAS)+2 IF nRR2 > MAXROW() nRR2 := ROW()-LEN(aGARANTIAS)-2 ENDIF SAVE SCREEN TO cTT5 MSGRODA("Tecle [Espaço] e/ou use o cursor ↓ ou ↑ e selecione com ◄┘[Enter]", "W+/BG") // Observe que @ LISTBOX é um comando do [x]Harbour @ ROW(),COL()-1,nRR2,COL()+LEN(GRT->MODALIDADE)+1 GET cBUFFER LISTBOX aGARANTIAS; COLOR "R/W, N/W, W+/W, W/N, W+/W, W+/W, GR+/W, N/W+"; DROPDOWN SCROLLBAR READ RESTORE SCREEN FROM cTT5 IF UPDATED() GRT->(LOCKREG()) // BLOQUEIA O REGISTRO ANTES COMPARTILHADO GRT->MODALIDADE := cBUFFER GRT->(DBUNLOCK()) // DESBLOQUEIA O REGISTRO oTBRX:REFRESHALL() // ATUALIZA TBROWSE ENDIF RETURN .F.
Como você pode perceber, o céu é o limite!
Comentários recentes