Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. Por acaso este efeito não está ocorrendo enquanto você está executando o programa por dentro da IDE do Delphi? Nesta situação, a exceção ocorre, o fluxo de execução é desviado para a linha com erro na IDE e você pode seguir depurando (F7 ou F8) ou executanto (F9), mas na sequencia o programa irá continuar e executar o InputBox dentro do except. para pedir o caminho quantas vezes seja necessário - até que seja um arquivo válido, sugiro que você utilize um repeat..until e a função FileExists, de modo que não será necesário utilizar try..except.
  2. Micheus

    Units NÃo Usadas

    Eu desconheço algum. Mas se sua preocupação é com a inclusão de units que você não faz chamada vir a ser inclusa no seu executável, então não tem problema não se alguma chamada ficar "perdida". O compilador do Delphi não vai gerar código para o processo de geração do programa (isto é uma otimização). Voce pode perceber isto, ao criar uma procedure dentro de uma unit onde você tenha um form (por ex.) e não fazer qualquer chamada a ela. Daí, ao pressionar CTRL+F9 para a compliação, você observará que nas linhas de código desta procedure, não existirão na margem esquerda do editor aquelas bolinhas azuis que indicam pontos onde você pode adicionar break-points para depuração.
  3. Basta que você defina ela no corpo da unit (não dentro da classe do form). Tipo, após a sessão implementation: implementation var ascendente :Boolean; ... mas lembre-se: você vai ter que adicionar o nome desta unit em toda a cláusula uses das units em que você precisar referenciar a variável.
  4. Está aí uma coisa que não entendo...Para quê economizar componente, criar situações como esta, se o incremento no programa executável é quase despresível se comparado ao todo? Então, seria melho não utilizar componentes data-aware, mas sim edit's e mover todos os valores na mão. o fato de você utilizar a mesma consulta em mais que um formulário e puxando campos de tabelas diferentes é suficiente para esse erro ocorrer!!!Só funcionaria se cada form existisse sozinho. Se os dois estão criados, um deles ligado ao datasource deste dataset comum (sua query) recebendo o campo da tabela1 e o outro form, utilizando outro datasource, mas apontando para o mesmo dataset (sua query) está referenciando um campo da tabela2. Ao abrir uma das consultas é claro que o campo de um dos forms não vai existir e terá este tipo de erro. Abraços
  5. Sugestão: Trabalhe com uma consulta que traz os dados do veículo (trará o cabeçalho que você utiliza) e duas outras consultas, uma para os abastecimentos e outra para as despesas. Então uma banda detalhe "correndo" pelo automóvel e duas sub-detalhes, cada uma com um dos outros datasets (utilize o group para cada sub-detalhe para montar seus respectivos headers). Abraços
  6. eu sugeriria o uso de Zeos - dê uma olhada por ai que você acha algo.
  7. Voce tem que por a mensagem de erro que recebe.Afinal? É um erro de compilação? É um erro de execução? Simplesmente não ocorre erro, mas não encontra nada? Sem informação não dá! Mesmo assim, a dica é utilizar parâmetro - você nunca vai ter um problema como este (a menos que faça algo errado): Sql.Add('Where (Passaporte Like :NumPassaporte)'); Sql.Add('Order by Passaporte'); // AsString porque seu parâmetro é uma string, do contrário: AsInteger, AsDateTime,... ParamByName(NumPassaporte).AsString := %'+ '00340' +'%'; Open; end;
  8. você poderia marcar (selecionar) esta linha e aplicar a função. Acho que daria certo. eu estou em curso esta semana e sem tempo para testar essas coisas, então só vou sugerir. Abraços
  9. com certeza este era um ponto importante. Parti do princípio que o indivíduo não trabalharia mais que 24:00hs.Veja se você consegue adaptar, se não der avisa.
  10. É tinha alguns errinhos. :rolleyes: ADN = Adicional Noturno. procedure TForm1.Button1Click(Sender: TObject); const ADNInicio = (22 /24); // 22:00 ADNTermino = (5 /24); // 05:00 Var DtEntrada, HrEntrada, DtSaida, HrSaida, HrInicioADN, HrTerminoADN, QtHorasTrabalhadas, QtHoraADN : TDateTime; begin dtEntrada := StrToDate('30/06/2007'); hrEntrada := StrToTime('21:00'); dtSaida := StrToDate('01/07/2007'); hrSaida := StrToTime('10:00'); // total de horas trabalhadas qtHorasTrabalhadas := ((dtSaida + hrSaida) - (dtEntrada + hrEntrada)); // calculando total de horas noturnas (ADN) qtHoraADN := 0; if (ADNInicio >= hrEntrada) and ((hrEntrada +qtHorasTrabalhadas) > ADNInicio) then begin // período onde as 22:00 está dentro - calcula ADN (Adicional Noturno) // determinar hora de início do ADN if hrEntrada < ADNInicio then HrInicioADN := ADNInicio else HrInicioADN := hrEntrada; // determinar hora de término do ADN if hrSaida < hrEntrada then // significa saida APÓS as 24:00 do dia de entrada begin if hrSaida >= ADNTermino then // se o cara saiu depois das 5, recebe até ai HrTerminoADN := ADNTermino else HrTerminoADN := hrSaida; // o cara saiu antes das 5 end else // significa saída ANTES das 24:00 do dia da entrada HrTerminoADN := hrSaida; qtHoraADN := ((dtSaida + HrTerminoADN) - (dtEntrada + HrInicioADN)); end; Label1.Caption:=timetostr(qtHorasTrabalhadas); //resultado horas trabalhadas Label2.Caption:=timetostr(qtHoraADN); //resultado horas noturnas label3.caption:=timetostr(QtHorasTrabalhadas - QtHoraAdn); //resultado horas Diurnas end; tenta assim. Observe os comentários - acho que explicam tenho dúvida se esta linha será sempre válida para todas as situações (tem testar - verifique):qtHoraADN := ((dtSaida + HrTerminoADN) - (dtEntrada + HrInicioADN)); o lance de dividir por 24, está associado ao que já mencionei (posts acima) sobre o formato do campo TDateTime - tenha isso em mente.
  11. do ponto de vista do conceito sim. Então é isto mesmo.Fique atento ao que coloquei com relação a chave primária da tabela principal - tem que ser única. Se existirem n itens nesta tabela, e o campo da chave poder ser repetido, então ela não será única e, ao tentar inserir um outro registro com este valor você receberá um "Key Vialation". A chave estrangeira (também é um índice), em termos de modelagem de dados, contém todos os campos da chave primária da tabela relacionada (principal) e normalmente (não necessariamente) mais algum. Já que utiliza "DB de homem", avalie a criação das integridades referenciais (como mencionei antes), mas vai implicar na correta observação do que disse no parágrafo anterior. Mas esse lance de modelagem de dados, aplicação das regras de normalização do banco de dados estão fora do meu escopo - tem que pesquisar por ai. ;) (se não me engano já posteis links sobre isso - post isso pode depender da sua lógica. Então, fica complicado eu opnar, até porque a única implementação que fiz neste sentido era muito simplória.Espero que outros colegas que trabalham/trabalharam com isto possam lhe ajudar. Abraços
  12. vms, você poderia tentar utilizar um campo calculado, do tipo inteiro, e para este campo você moveria o RecNo. Supondo o nome da coluna NumOrdem (vamos deixar o campo Numero do seu banco em off), você no evento OnCalcField você faria: TabTesteNumOrdem.Value := TabTeste.RecNo; Testa aí para ver se funcina (eu acho que sim, mas não tenho como conferir agora). Se tiver dúvida de como criar o campo calculado dá uma olhada neste tutorial e pesquise pelo texto: "DataModule:" (sem as aspas), é o segundo item nesta sessão. Abraços
  13. O uso de lookup (DBLookupComboBox/ListBox e campos, ou seja, Fields) tem como objetivo, buscar na tabela lookup todas as linhas (referente aos campos definidos) aonde o campo referenciado na tabela principal aparece. Acho que esse é um daqueles casos que é melhor desenha, para entender. ;) Na figura abaixo, está indicado onde cada datasource/campo devem ser configurados. Os quadros vermelhos indicam o campo de relacionamento (NrMatricula) e o azul, os que serão apresentados no DBLookupListBox. Esta configuração trará, como resultado no DBLookupListBox, uma lista com todas as pessoas que poderão ser selecionadas para que uma seja atribuída a tabela principal - conf. NrMatricula. Este procedimento será sempre igual, estejam os componentes em Form's ou Datamodule. Espero ter ajudado a clarear as dúvidas. Abraços _________________ Livio, pensando melhor sobre o exemplo, vi que havia o colocado invertido (dá um desconto, porque as 06:00 só Teko tá trabalhando - o Tiko já dormiu, hehehe). A imagem estava mais para uma relação mestre detalhe. Então eu alterei-a. Quem já leu, me desculpe.
  14. Não estou podendo queimar muita pestana por agora (e nos próximos dias), então a dica é que este problema pode estar relacionado ao fato de que você não está levando em conta a data.Por ex., o sujeito bate o cartão: - Entrada 30/06/2007 23:35 - Saída 01/07/2007 08:40 Bom, se eu não estiver errado, o ADN começa às 22:00 e encerra às 05:00. Se você leu os links que coloquei no post do dia 28/06/2007 - 16:10, vai entender que podemos somar a data e a hora para termos uma informação só: dtEntrada := StrToDate('30/06/2007'); hrEntrada := StrToTime('23:35'); dtSaida := StrToDate('01/07/2007'); hrSaida := StrToTime('08:40'); // total de horas trabalhadas qtHorasTrabalhadas := (dtSaida +hrSaida) -(dtEntrada +hrEntrada); // calculando total de horas noturnas (ADN) qtHoraADN := 0; if hrEntrada >= 22 then begin if qtHorasTrabalhadas > (24 -hrEntrada) then // significa que hora de saída é no outro dia begin qtHoraADN := (24 -hrEntrada); // até o final do dia - 24:00 if hrSaida >= 5 then // se o cara saiu depois das 5, recebe até ai qtHoraADN := qtHoraAdicional +5 else qtHoraADN := qtHoraADN +hrSaida; // o cara saiu antes das 5 end; end else // o cara poderá ter entrado após as 00:00 if hrEntrada < 5 then begin if hrSaida >= 5 then // se o cara saiu depois das 5, recebe até ai qtHoraADN := 5 -qtEntrada else qtHoraADN := hrSaida -hrEntrada; // o cara saiu antes das 5 end; acredito que lógica esteja clara e fazendo o cálculo correto. Veja se você consegue trabalhar com algo mais parecido com isto - parece-me um pouco mais claro (só não sei se as fórmulas estão corretas - não fiz nada com folha de pagamento) será que utilizando o esquema data/hora como coloquei, este problema não sumirá? Abraços p.s.: quando postar código, utilize a tag CODE e não QUOTE. Veja como fica mais legível:procedure TForm1.Button1Click(Sender: TObject); var h,h1,h2,m,m2,m1,s,s1,s2,ms,ms1,ms2:word; inicio,fim:TTime; i,x,cont:smallint; Resta:TDateTime; noturna:real; begin cont:=0; inicio:=strtotime(edit1.Text); fim:=strtotime(edit2.Text); decodeTime(inicio,h,m,s,ms); //desmembro a hora inicio decodeTime(fim,h1,m1,s1,ms1); //desmembro a hora final resta:=fim-inicio; //calculo a diferença entre as duas if (h1=0) or (h1<h) then resta:=resta+strtotime('23:59:59')+strtotime('00:00:01'); //corrigo bug se houver label3.Caption:=timetostr(resta); //resultado da subtração decodeTime(resta,h2,m2,s2,ms2); //desmembro o resultado for i:=0 to h2 do //para i=0 até o numero de hora trabalhada(h2) begin x:=h+i; // x recebe hora inicio(h) +1 if x > 24 then //se a soma for maior que 24 x:=x-24; //corrigo o bug pois o n° pode dar 25,30 etc... if x in[22,23,0..5]then //aqui verifico se a hora é adicional noturno cont:=cont+1 end; if (h in[0..5]) then //correção de + um bug senão ira contar já a hora inicio cont:=cont-1; //** se começar em 0,1,2,3,4 não contar o a primeira hora label4.Caption:=inttostr(cont); //Eu ia me esquecendo cont representa a quantidade de hora adicional noturno que a pessoa trabalhou noturna:=StrToTime(label4.caption); //recebe a hora noturna label5.caption:=timetostr(Resta-noturna); //aqui é o total de horas Dirnas...ele pega o total de horas - a noturna... end;
  15. mas... vms, se você puder substituí-lo por um TRichEdit (normalmente é possível), então há uma possibilidade. Dê uma olhada neste tópico Richedit (linhas Coloridas) Abraços
  16. deseja alterar algum campo na tabela estoque quando registrar um item na saida, é isto? Se form, esta resposta pode depender do banco que você está utilizando.Se trabalhar com Paradox ou Access, então você terá que fazer este controle no código do programa (para qualquer banco isto pode se aplicar). Se estiver um banco de dados "de verdade" como MySQL, Interbase ou Firebird poderia fazer o uso de trigger. A questão do relacionamento, realmente envolve o uso de uma chave primária (PK) na tabela master e uma chave estrangeira (FK) na tabela detalhe, viabilizando o uso de integridade referencial (ou seja, o item informado na tabela detalhe tem que existir na tabela master, do contrário é erro). - uma definição aqui no forum - link; - um pouco sobre chaves - link O Paradox até tem recurso para criação de relacionamentos (via Database Desktop) mas, que eu saiba, quase ninguém usa. O pouco que li sobre isso há alguns anos, mostrava que os arquivos mantidos pelo Paradox, para guardar esta informação, corrompiam freqüentemente. O Access suporta relacionamentos (tem uma opção no menu) e nunca tive problemas. Se utilizar os bancos de "verdade", você vai criar a Foreign Key definindo a relação a sintaxe: alter table <tabela_detalhe> add foreign key (<campo_relacao>) references <tabela_master>(<campo_relacao>), [foreign key (<campo_relacao>) references <tabela_master>(<campo_relacao>)] Este relacionamento explícito irá fazer com que o banco de dados garanta a integridade referencial. Mas o que significa integridade referencial? Em poucas palavras, significa dizer que você não vai fazer a inserção de um campo na tabela detalhe que não exista na tabela master, ou que você não vai poder excluir uma linha da tabela master, sem que antes exclua os itens na tabela detalhe. No programa o controle pode ser feito utilizando a ligação da tabela detalhe, via propriedade MasterSource (e campos associados), a tabela master. Se utilizar componentes tipo query, você pode parametrizar a consulta - na cláusula where você coloca o campo de relação. O mais importante é você ter bem em mente como é este esquema de relacionamento de dados. CREATE TABLE "estoque" ( "DATA" DATE NOT NULL, "TIPO" VARCHAR(30), "MARCA" VARCHAR(30) NOT NULL, "REPRESENTANTE" VARCHAR(20), "Valor_Unit" FLOAT, "QUANTIDADE" VARCHAR(20), "VALOR TOTAL" FLOAT, CONSTRAINT "PK_ESTOQUE" PRIMARY KEY ("MARCA")); CREATE TABLE "SAIDA" ( "DATA" DATE NOT NULL, "TIPO" VARCHAR(30), "MARCA" VARCHAR(30) NOT NULL, "VALOR_UNIT" FLOAT, "QUANTIDADE" VARCHAR(20) NOT NULL, "VALOR_TOTAL" FLOAT, PRIMARY KEY ("MARCA", "QUANTIDADE"));Minha duvida é: existe um relacionamento nas tabelas que criei? ou eu fiz c4g4d4 de novo?
  17. ROBINHOCNE, é como o colega Jonas disse, ocorre porque você moveu a pasta. Fica a dica: (enquanto você não sabe exatamente o que está fazendo) nunca mova os arquivos na mão - utilize sempre a opção "Save As..." da IDE do Delphi, porque daí ela acerta todos os caminhos (definidos internamente) sem que você passe por estes problemas. Daí sim, você pode ir lá naquela pasta e excluí-lo de lá (tendo certeza, é claro, de que o procedimento sugerido foi realizado com sucesso). No seu caso, você precisará acessar o código do projeto (menu Project -> View Source - é algo assim). Voce encontrará a lista das units (forms) utilizados no seu projeto. Muito provavelmente, a dita unit estará precedida pelo caminho que você tinha inicialmente gravado a mesma - então, provavelmente você precisará apenas remover este caminho (fica apenas o nome da unit). Outra dica é: Nunca renomeie seu arquivo (unit) via windows explorer. Utilize o mesmo procedimento - opção "Save As...". Abraços
  18. Micheus

    Dúvida Sql

    você poderia, ainda, tentar utilizar o LIKE na cláusula WHERE: 'select * from MOVIMENTO where REFERENCIA LIKE '+QuotedStr('%' +edit1.text); o % antes do texto a procurar resultará em localizar tudo que termine com a sequência em edit1.text;
  19. Micheus

    Sql - Interbase

    Não é bem isso. São duas coisas distintas.O que ocorreu é que, em 2000, a Borland abriu o código do InterBase v6.0 - as posteriores voltaram a ser proprietárias. Foi a partir desta versão, que programadores reuniram-se para resolver bugs - surgindo daí o FireBird v1.0 (ref.). O InterBase está hoje na versão 2007, enquanto que o FireBird, que seguindo seu próprio caminho, está na versão 2.0.1 (ref.) e caminhando para a versão 3.0 (codnome Vulcan - Road map.) Abraços
  20. foi lido você quiz dizer? Não?! É que este, é o método mais fácil de deixar um tópico quente aqui no forum. Eu acho que é um bug "sério", em que um usuário ingênuo ou mal intencionado, aumenta a contagem de leituras de um tópico apenas fazendo o refresh durante a leitura do post.
  21. parece uma variavel né?? Exato. Talvez o cara tenha definido ela globalmente.Declara ela local como TDateTime (junto com as que já estão declaradas) e vê no que dá.
  22. Seguindo o raciocínio: TPeriodo :array[1..3] of Double; // temperaturas no Períodos: Manhã, Tarde e Noite TEstacao :array[1..4] of TPeriodo; // períodos nas Estações: primareva, outono, verao e inverno TRegiao :array[1..5] of TEstacao; // estações nas Regiões: sul, leste, norte, noroeste e centro Região sul: aRegiao[1] (nesta posição há um array das estações) Estação verão da região sul: aRegiao[1][1] (nesta posição há um array dos períodos) Período da tarde no verão da região sul: aRegiao[1][1][2] (nesta posição há um array dos períodos) type TPeriodo = array[1..3] of Double; // temperaturas no Períodos: Manhã, Tarde e Noite TEstacao = array[1..4] of TPeriodo; // períodos nas Estações: primareva, outono, verao e inverno TRegiao = array[1..5] of TEstacao; // estações nas Regiões: sul, leste, norte, noroeste e centro var aRegiao :TRegiao; begin aRegiao[1][1][2] := 30.0; // 30°C no período da tarde no verão da região sul end; Veja se consegue captar a idéia agora. Abraços
  23. utilize a propriedade Mask deste componente: R$ #,##0.00Deve funcionar.
  24. deivis, nesta situação, o principal é que a pasta (caminho) do servidor seja compartilhada com as demais máquinas (daí você pode optar por mapear como uma unidade de rede ou utilizar o caminho com o nome do servidor). Com relação ao código, dê uma olhada neste tópico que tratou justamente deste assunto. Veja se você consegue implementar no seu código. Abraços
  25. Só vou poder ver isso pela madrugada. Enquanto isso, dá uma olha deste post (forum ActiveDelphi) que eu tinha visto por lá há algum tempo. Tem também um recente - tá incompleto, mas vai que dá para aproveitar algo. Abraços
×
×
  • Criar Novo...