Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. Micheus

    AJUDA SQL

    Sérgio, você não poderia criar uma procedure no banco para fazer isso. Acredito que não haja meio de fazer o que você deseja em uma única consulta.
  2. Dr. House, veja se isto vai lhe ajudar: select a.* from funcionarios a where (select count(nome) from funcionarios f where f.nome = a.nome) > 1deve listar todas as ocorrências de um funcionário, quando seu nome aparecer mais que uma vez no banco de dados. Abraços
  3. BruNo_GouLarT, existe apenas a função UpCase que converte caracteres (apenas 1) e a função StrUpper que converte cadeias de caracter do tipo PChar (que é diferente de string). Assim, para converter uma string, você pode criar uma função para isto, onde processa cada caracter da string convertendo ele para maiúsculo. Vou postar um programa basicão ilustrando seu uso: program TesteUp; function UpperCase(source :string) :string; var Idx :byte; begin for Idx := 1 to Length(source) do source[Idx] := UpCase(source[Idx]); UpperCase := source; end; var Linha :string[50]; begin Write('Digite um texto: '); Readln(Linha); Writeln(UpperCase(Linha)); Readln; end. Abraços
  4. R.: Micheus...mas como vou mapear a pasta NO PRÓPRIO SERVIDOR??? pelo que eu sei...só da pra fazer via rede.....na estação de trabalho....tipo localizo o servidor via rede e depois mapeio.. a não ser que estou enganado :blush: estou vendo que você nem tentou, heim?! :D O procedimento é exatamente o mesmo que para as estações. O jeito simples: - abre o Windows Explorer; - na barra de endereço coloca o nome do seu servidor. por ex.: \\Morpheus (este é do meu); - localize a pasta que está compartilhada. Sobre ela, use o botão direito do mouse, acesse o menu de contexto e selecione a opção Mapera unidade de rede... ... É para funcionar.
  5. em que linha está ocorrendo este erro: number is out of range?
  6. Micheus

    Imprimir etiquetas

    Aprendendo, se você não precisa de qualquer recurso especial, como impressão de imagens, alteração de fontes, a opção mais simples e de impressão rápida seria justamente a impressão direta. Como você disse que imprime em formulário contínuo, vou assumir que utiliza o tamanho padrão - 11,5" (11 polegadas e meia). Agora, vamos transformar isto em mm para facilitar a compreensão do que tenho querido dizer. Vamos lá: 1" equivale a 2,54cm ou 25,4mm, logo 11,5" x 25,4mm = 292,1mm (um pouquinho a baixo do que você está usando não é?!). Bom, dividindo isto pela quantidade de linhas que você tem (12), então a sua banda detail deveria ter 24,3416666mm. Isto porque estamos considerando toda a área da folha de 11,5". Formatação deste tipo, tem que levar em conta também as margens físicas (limites) da impressora. No caso das maticiais, são praticamente de 0mm, quando usando formulário contínuo em que o tracionador conduz a folha Se usar folha avulsa, você verá que quando chegar próximo ao final da folha (coisa de 1,5cm) a folha já estará "caindo" do carro de impressão porque não tem sustentação. No caso das jato de tinta, as margens inferiores também variam. Minha antiga DeskJet 550 tinha uma margem inferior de 1,85cm, enquanto que em minha atual, este valor baixou para 1,17cm - "ganhei" 68mm (cabe, pelo menos, uma linha a mais no papel). Resumindo, experimente ajustar o papel para o formato adequado a sua impressora (talvez seja o letter); defina as margens superior e inferior para 0mm; não utilize qualquer outra banda que não seja a detail (neste caso da impressão só de etiquetas); E lembre-se, o nº de linhas x a altura da banda não pode ultrapassar a área útil (altura da folha menos soma das margens inf. e sup.) Jhonas, só pode ter sido coincidência. Formate o documento para o tamanho A4, utilize toda sua área e tente imprimir em uma impressora com o formato Letter. É uma questão física (se não cortar, ficará em outra página):Letter size is 8½ × 11 inches = 215.9 × 279.4mm A4 standard = 210mm × 297mm Abraços
  7. Amigo obrigado pela ajuda, mas continua o mesmo erro! :unsure: RobinhoCne, não tem como retornar um valor só. Ou melhor, algumas vezes podem haver mais que um valor - mesmo com a sugestão do Jhonas de usar distinct. Veja que você está buscando em lançamentos, as parcelas do aluno (A.Codigo) onde o mês (Month) do vencimento (L.Vencimento) seja menor ou igual (<=) ao mês atual. Agora perceba o óbvio: se o cara está dois meses atrasado, quantas linhas (parcelas) serão retornadas? (espero que você tenha respondido 2 - duas). Bom, o distinct, faria com que fosse trazido apenas uma ocorrência dos valores de cada coluna em uma linha retornada, logo, havendo duas datas diferentes, não tem como aparecer apenas uma linha como resposta. Se você colocar no lugar de distinct a expressão First 1, você estará dizendo para retornar apenas a primeira linha. Neste caso você não dever mais ter o erro mencionado. Entretanto, também não é o resultado que espera ter para o seu programa, não é?! Mas você pode fazer isto apenas para testar. ;) Sou obrigado a dizer este tipo de dúvida aparece por conta do modo como você está programando. Se você elaborasse uma consulta SQL de modo "tradicional", facilmente poderia utilizar o JOIN conforme o Jhonas sugeriu, e o "problema" estaria rapidamente solucionado, porque não haveria a necessidade de entender a forma como você usa estes procedimentos (com o LeRegisto). Quando você diz: "O LeRegistro é um procedimento que eu faço para a pesquisa, mas o importante: ..."; Não é verdade. O procedimento é importante sim, porque para este caso, por exemplo, faz-se necessário entender como seu procedimento funciona para saber como sugerir uma alteração nestes seus parâmetros de modo a tentar resolver a questão. Mas ele é desconhecido pela maioria dos que acessam o forum. Como eu já tive que ver este procedimento em outras oportunidades, eu arriscaria dizer que você poderia fazer do seguinte modo: procedure Tfrmalunos.spbpesClick(Sender: TObject); begin with vcpo do begin clear; add ('A.Nome'); add ('A.Codigo'); add ('A.Cpf'); add ('A.Processo'); Add ('A.CnhEntregue'); Add ('L.Vencimento); end; with vvlr do begin clear; add ('Nome'); add ('Codigo'); add ('Cpf'); add ('Processo'); end; with TFrmPesAluno.create (application) do begin try tabela := 'alunos A left join Lancamento L on (L.Aluno = A.Codigo and extract(month from L.Vencimento ) <= extract(month from current_date))'; camporetorno := 'codigo'; showmodal; finally free; end; end; if (retorno<> '') then begin inherited; LeRegistro(); Se não funcinar, paciência. Se funcinar, tente entender, pois poderá precisar de algo parecido futuramente. Ao meu ver, ainda haverá um erro de "lógica" a ser verificado. Pense da seguinte maneira, se o cara deixa de pagar Nov (11) e Dez (12) e você estiver fazendo a consulta em janeiro. Vai aparecer algum pagamento em aberto? Abraços
  8. Micheus

    duvida com undo\redo

    Micheus como uso esse codigo com DBRichedit? vms, como lhe disse no outro tópico, ambos são basicamente a mesma coisa. Logo, o procedimento é o mesmo: use o método Perform do componente TDBRichEdti (eu diria que tem que funcionar). Abraços
  9. Como sugeriu o Jhonas, com o que você postou não dá para ajudar. O ideal seria pelo menos você postar o código que está no tal botão. Mas, já que você parece não querer postar o código... pelo menos, dê mais informação sobre sua aplicação:Este formulário, com os botões, é o principal ou outro que você chama usando ShowModal? Se a resposta for a segunda opção, o botão que você utiliza neste formulário é um dos tipos: TButton ou TBitBtn? Se for, qual o valor da propriedade ModalResult? Ajude-nos a ajudá-lo. ;)
  10. Micheus

    Imprimir etiquetas

    Supondo que você já tenha implementado o relatório da forma como o Jhonas lhe indicou... Verifique se você configurou corretamente o tamanho do papel e as margens superior e inferior (em formulários contínuos elas são praticamente zero). só para não ficar dúvidas, este era o código que você usava, certo?! Porque isto não tem relação com o QuickReport. Abraços
  11. Eder, acho que esta última pergunta ainda está em aberto, certo?! A situação parece típica de quando você compila sua aplicação para utilizar as BPL's em run-time, ao invés de design-time. Nesta última opção, todo o código necessário para seu programa funcionar, mas que "encontram-se" nas BPL's, é incorporado ao seu programa final. Há uma opção nas propriedades do projeto que modificam como isso ocorre. Por padrão, ela estaria desabilitada. Para verificá-la, abra este seu projeto e dê uma verificada em: menu Project->Options, vá até a guia Packages e verifique ser o checkbox com um texto similar a Build with runtime packages está marcado. Se estiver, desmarque e compile sua aplicação. Execute ela em um computador que não seja o de desenvolvimento (que não tenha o Delphi instalado) e veja se deixou de mostrar o erro. Abraços
  12. Micheus

    Stringgrid e buttons

    Wise, por favor melhore sua pergunta... O que exatamente você quer fazer exatamente com os outros dois botões e StringGrids?
  13. Rafael, você está falando sobre programação em PL/SQL do Oracle? Esta implementação seria no banco então?
  14. Isto mesmo, Eder. Todas as máquinas tem que apontar para o mesmo caminho. Então, se as referências que o Jhonas lhe passou não resolverem o seu problema, experimente algo simples que possivelmente funcionará: mapeie a pasta no próprio servidor! Abraços
  15. R> não entendi esta parte.....o código que você passou então muda?Não. Mas, como você já tem o relatório pronto, eu quiz salientar que você deverá definir como dataset de origem de dados para ele a tabela TabTmp (ou como você a tenha chamado) e não a QueryTodas, como eventualmente você possa ter utilizado. Abraços
  16. vms, neste caso (utilizar uma função para dois componentes diferentes), você deve tentar utilizar como parâmetro a classe hierárquica comum a ambos, o mais próximo delas. Observe que ambos são descendentes de TCustomRichEdit. Assim, use-a na declaração do cabeçalho da função: procedure LineSpaceRichEdit(RichEdit :TCustomRichEdit; Espacamento :Integer; AllText :Boolean); Abraços
  17. Como eu poderia fazer esta Unit, pois tem funções que utilizo em vários forms, João Paulo Taraciuk, esta sua função teria lugar mais apropriado no datamodule(ou mesmo um form) principal (aquele que dura durante toda a aplicação). Eu tenho a seguinte função em meu projeto: function TDMMain.GetNewFieldCod(TableName, FieldName :string; WhereOption :string = '') :LongInt; begin Query1.SQL.Text := 'SELECT (MAX('+FieldName+')) AS '+FieldName+' FROM '+TableName; if WhereOption <> '' then Query1.SQL.Add(WhereOption); Query1.Open; Result := Query1.FieldByName(FieldName).AsInteger +1; Query1.Close; end; observe que neste datamodule, eu tenho um componente tipo query (Query1) que é utilizado exclusivamente para isto - ele já está devidamente vinculado ao componente database. Esta função, como dá para observar é genérica, porque eu posso passar o nome da tabela, do campo e alguma condição extra (WhereOption). Eu a uso no evento BeforePost dos datasets que necessitam obter algum código sequencial. Vejamos um exemplo de uso: procedure TDMDiversos.DstCidadeBeforePost(DataSet: TDataSet); begin if DataSet.State = dsInsert then DstCidadeCOD_CIDADE.Value := DMMain.GetNewFieldCod('CIDADE', 'COD_CIDADE'); end; apenas se estiver no modo inserção é que obtermos o novo código. e um exemplo onde o código é gerado baseado em outro campo: procedure TDMDiversos.DstEntidadeProgramaBeforePost(DataSet: TDataSet); begin if DataSet.State = dsInsert then DstEntidadeProgramaCOD_PROGRAMA.Value := DMMain.GetNewFieldCod('ENTIDADE_PROGRAMA', 'COD_PROGRAMA', 'WHERE COD_ENTIDADE = '+DstEntidadeProgramaCOD_ENTIDADE.AsString); end; neste caso, o valor gerado para COD_PROGRAMA é obitido para cada código em COD_ENTIDADE. Ou seja, para entidade 1, posso ter codigo do programa 1, 2, 3,...; para entidade 2, da mesma forma: 1, 2, 3, 4, ...; No caso da outra função que eu havia citado este recurso, você deveria proceder assim: no Delphi7, acessa menu File->New->Unit (cria uma nova unit). O corpo dela será criado assim: unit Unit1; interface implementation end. logo após interface, você deverá colocar o cabeçalho das funções e procedimentos a serem exportados para as outras aplicaçãos - funções que não estiverem "declaradas" ali, não estarão disponiveis para sua aplicação. Já, logo após implementation, como o nome diz, vem a implementação dos seus procedimentos ou funções. você deve acrescentar a cláusula Uses para incluir a units que você precisar (fizer uso nesta unit). O exemplo ficaria assim, então: unit Unit1; uses SysUtils; interface function FormatStrSize(Source :string; Ch :char; Size :byte) :string; // aqui outras declarações implementation // Source = a string passada para ser formatada // Ch = caracter a ser utilizado para preencher à esquerda // Size = tamanho da string que deve ser retornada (largura da coluna) function FormatStrSize(Source :string; Ch :char; Size :byte) :string; begin Result := RightStr(StringOfChar(Ch, Size) +Source); end; // ... outras funções end.ao gravar você deverá dar um nome a ela. Este será o nome que você utilizará na cláusula uses da sua aplicação.
  18. vms, parece um um erro com a forma como você está usando o código. Dá para você por a parte do código em que o erro ocorre?
  19. Kartter, acho que quando você diz: "não consigo visualizar as atualizações feitas nela" você está se referindo às alterações efetuadas na tabela de onde, os dados mostrados no DBGrid, são obtidos. Não é mesmo?! Quanto a visualização de dados atualizados no DGBrid, não há outro meio que não pela re-execução da consulta (o tal close/open) - é uma questão de otimização. Imagine centenas de usuários fazendo consulta o tempo todo (a cada segundo, por ex.), apenas para atualizar uma visualização, que pode nem ter sofrido auterações. No caso do Firebird e Intebase, há a possibilidade do uso de eventos para que você promova uma atualização apenas quando há alterações, mas este recurso deve ser utilizado com moderação - veja este artigo: The Power Of The Firebird Events Jhonas, a dica é boa, mas acho que não é esta a situação colocada pelo Kartter. Observe que ele diz que: "2 estações conseguem dar edit em um mesmo registro"; Então, ele está falando sobre a possibilidade de mais que um usuário alterar a mesma informação (uma já cadastrada).Acredito que este seja o caso de utilizar um Lock explícito, mas já recebi argumentos de que não seria apropriado. Veja este tópico: "Bloqueio de Registro" e opine por si só. Abraços
  20. A única diferença entre um e outro é que este último, acessa o texto a partir do banco de dados, logo, dá para fazer sim. Abraços
  21. so_free observe que a função faz uso uma aproximação do ano (365,25) para os cálculos.Se o objetivo for obter o tempo exato decorrido entre as datas, ela não tem tal precisão. Serviria mais a título de informação, não leva em conta a passagem de um ano bisexto, por exemplo (esses 0,25 é justamente o dia a mais a cada 4 anos, ou seja, 0,25 dias a mais por ano). Segue, então, a tradução ao "pé da letra": Function diferenca_datas(Dtini, Dtfin :TDate) :string; var xAnos, xMeses, diferenca :Double; dias, anos, meses :Integer; begin If (Dtini = 0) Or (Dtini > Date) Or (Dtini > Dtfin) Then Begin MessageDlg('Data inválida !', mtError, [mbOk], 0); Exit; End; diferenca := Dtfin - Dtini; xAnos := diferenca / 365.25; anos := Trunc(xAnos); xMeses := (xAnos - anos) * 12; meses := Trunc(xMeses); dias := DaysBetween(EncodeDate(YearOf(Dtini) + anos, MonthOf(Dtini) + meses, DayOf(Dtini)), Dtfin); If dias = 30 Then dias := 0; If meses = 12 Then Begin meses := 0; anos := anos + 1 End; If anos > 1 Then Result := IntToStr(anos) + ' anos ' Else Result := IntToStr(anos) + ' ano '; If meses > 1 Then Result := Result + IntToStr(meses) + ' meses ' Else Result := Result + IntToStr(meses) + ' mês '; If dias > 1 Then Result := Result + IntToStr(dias) +' dias ' Else Result := Result + IntToStr(dias) +' dias '; End;Obs.: voce deve acrescentar a unit DateUtils na cláusula Uses. Cara, você quer dar um nó na minhas idéias. :wacko: Sua dúvida não era justamente na conversão da função VB para Delphi? :huh:
  22. Bom, você disse que está usando banco Access, então, se você tiver o MSAccess, este seria o modo mais rápido e simples de criar um índice: - Abra seu banco no MSAccess; - Selecione na opção Object a tabela em questão; - Click no botão Estrutura; - Acesse no menu Exibir (ou Show, eu acho) a opção Índices (ou Index); - Na janela que aparece, selecione uma linha vazia e defina o nome do índice; - Na coluna Nome do campo (Field name) selecione o campo a ser ordenado; - Na coluna Ordem de classificação, informe se é crescente ou decrescente; - Se houverem mais campos a serem utilizados neste índice, acrescente as informações sobre eles nas respectivas colunas, logo abaixo uma da outra. Obs: o nome do índice aparece apenas na primeira linha da definição do índice (ou seja, com o primeiro campo, os demais sequem abaixo deste) Depois de definido o índice, acredito que não seja problema você selecionar ele em seu componente tipo Table - não informou como está fazendo o acesso à tabela. Abraços
  23. João Paulo Taraciuk, para que você veja este arquivo corretamente em um editor de texto, você deverá mudar o fonte dele para um onde os caracteres tenham tamanho fixo - é o caso do Courier. Uma sugestão é abrí-lo com o velho editor em modo caracter (como no DOS) - Edit.com Abraços
  24. Então, crie um índice com o campo desejado.
×
×
  • Criar Novo...