
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
sempre tem um porém... :D claudyo, faltou também informar que componente você está utilizando para o acesso. por acaso você adicionou os campos (fields) ao dataset antes de fazer esta alteração no banco?Se sim, então, acesse os fields (na janela object inspector) e defina a propriedade Required deles para False. como você não poderá manter os dois campos como obrigatório, então prossivelmente você não terá como usar o OnPostError sugerido pelo colega sllc. Então, a primeira abordagem (testar no botão de gravação) seria mais aplicável.Há ainda a possibilidade de você fazer esta validação no evento OnBeforePost do dataset - e neste caso, você testaria o campo do dataset (não o Edit ou maskedit...) Abraços
-
plpamorim, é isto mesmo. Mas, vamos deixar mais claro ao colega Milton que o parâmetro só existe depois de sua declaração. Logo, os parâmetros devem ser inicializados antes da chamada ao método Open, que é o momento em que toda a consulta SQL já está construida e o componente já saberá que parâmetros foram declarados. Quanto a inicialização do parâmetro, costumo recomendar que seja usado o método que indica o tipo esperado de informação (pelo menos, quando o componente o permite). É um hábito que pode evitar dores de cabeça em algumas situações. Para o caso acima, onde é esperado que a informação seja um string, o código passaria de: qclientes.ParamByName ('nome').Value := ed.text; para qclientes.ParamByName ('nome').AsString := ed.text; se fosse data: qclientes.ParamByName ('data').AsDate := StrToDate(ed.text); (ou AsDateTime) Abraços
-
Dionísio Júnior, isto não seria uma outra questão? Chegou a verificar no help o que a classe tem a lhe oferecer?O caminho passa por uma propriedade, da classe TDBGrid, chamada SelectedRows (linhas selecionadas). Nestes tópicos já foram tratadas algumas aplicações dela - dê uma olhada, poderá lhe ser útil futuramente. O procedimento é bem simples. Entretanto, para evitar mal entendidos com o exemplo, seria conveniente que você informasse:- qual a relação do código do botão imprimir postado. Vejo que você trata de UM contrado, procurando suas parcelas mas pretende imprimir vários contratos; - qual o nome do dataset em questão (aquele que está ligado ao DBGrid)? Ele está no form ou no datamodule DM? - já que você está utilizando um TQRComposite, qual o nome do quickreport que listará a seleção? Adiantando um pouco... , para obter o efeito desejado: - o dataset ligado ao DBGrid, deverá estar acessível ao form do quickreport que listará a seleção; - este quickreport terá sua impressão gerenciada via evento OnNeedData e não lhe atribuiremos o dataset na respectiva propriedade; - neste quickreport deverá ser declarada uma variável indexadora que gerenciará a "navegação" pelos registros selecionados; ... Abraços
-
Violação de acesso/ query.create(nil) e query.free
pergunta respondeu ao Gabriel Cabral de Micheus em Delphi, Kylix
Gabriel Cabral, quando você ápenas compila o código (CTRL+F9), aparecem pequenas bolinhas (pontinhos) azuis na "regua" da margem esqueda do editor de código? Se não estão aparecendo, é porque este código está sendo ignorado pelo compilador e o provável motivo é que ele não esteja associado ao evento OnBeforePost do dataset tblCadPro - confira! Se estiver aparecendo, então não haveria motivo para não passar por este evento. Poderia simplesmente estar entrando nele e saindo pelo primeiro if..then onde você chama um Exit. Isto você consegue verificar, também, depurando e pondo um break neste if..then. Abraços -
Violação de acesso/ query.create(nil) e query.free
pergunta respondeu ao Gabriel Cabral de Micheus em Delphi, Kylix
Gabriel Cabral, isto é bem ruim mesmo e provavelmente você não pode mudar, não é?!Mas, eu lhe diria que em termos do seu problema inicial, a questão se resolve com o código que você tem agora. Entretanto, passamos a uma nova questão: por que o valor não é incrementado? Você sabe depurar o código? Se souber adicione um break-point na linha da atribuição do novo valor e quando a execução parar ali, utilizar a caixa de avaliação (CRTL+F7) para verificar o conteúdo do campo. Se não souber, coloque um ShowMessage antes da atribuição, para que você possa verificar o valor do campo: ... ShowMessage(tblCadPro.FieldByName('PROCOD').AsString); tblCadPro.FieldByName('PROCOD').AsString := FloatToStr(StrToFloat(Query1.Fields[0].AsString)+1); ... Abraços -
Violação de acesso/ query.create(nil) e query.free
pergunta respondeu ao Gabriel Cabral de Micheus em Delphi, Kylix
Gabriel Cabral, eu passei batido em uma parte do seu código. Por acaso PROCOD é um campo varchar na tabela? Se for numerico, troque: tblCadPro.FieldByName('PROCOD').AsString := FloatToStr(StrToFloat(Query1.Fields[0].AsString)+1); por: tblCadPro.FieldByName('PROCOD').Value := Query1.Fields[0].Value+1; e veja como fica o resultado -
se após a sugestão do colega Jhonas, voce ainda continue pensando em usar o QuickReport, dê uma olhada neste tópico: Imprimir Etiquetas no QuickReport (não deixe de avaliar os posts #6 e #10) Abraços
-
Obrigado pelas palavras.Como não programo profissionalmente, acabo por produzir algo através destes auxílios. ;) A origem da mensagem, muito provavelmente é esta mesmo. Aparentemente você não adicionou os campos no seu dataset, já que usa o FieldByName, mas você saberia dizer qual a classe de que estamos tratando? (certamente não é um TBlobField)E qual o tipo deste campo definido no banco de dados? É sempre complicado tentar ajudar em algo que não se tenha à mão para testar, mas assumindo que o campo no banco possa ser utilizado para o fim a que se destina e que a classe do campo no dataset possa fazer uso de stream (ser descendente de TBlobField), acredito que precisamos combinar as duas abordagens que você postou aqui. Veja como funcionará algo assim: procedure TForm1.BtnGravarImagem(Sender :TObject); var MS :TMemoryStream; jpg :TJpegImage; begin if FileExists(Trim(mskedtMatricula.Text)+'.jpg') then begin jpg := TJpegImage.Create; try jpg.LoadFromFile('C:\SGP\Fotos\'+Trim(mskedtMatricula.Text)+'.jpg'); MS := TMemoryStream.Create; try jpg.SaveToStream(MS); (dtmdlFolha.zqryServidor.FieldByName('ft_servidor') as TBlobField).LoadFromStream(MS); finally MS.Free; end; finally jpg.Free; end; end; end; veja que usamos o objeto jpg para carregar a imagem. Uma vez carregada a imagem, criamos o MemoryStream e movemos a imagem para ele e só então, carregamos ela para o campo na tabela. São realmente os questionamentos que fiz acima. Abraços
-
sllc, você não disse que posts leu, então, segue de referência estes porque o caminho passa, com mais segurança, pelo uso de TMemoryStream: http://scriptbrasil.com.br/forum/index.php...st&p=458617 http://scriptbrasil.com.br/forum/index.php...st&p=471083 http://scriptbrasil.com.br/forum/index.php...st&p=427052 Abraços
-
Violação de acesso/ query.create(nil) e query.free
pergunta respondeu ao Gabriel Cabral de Micheus em Delphi, Kylix
Gabriel Cabral, tem algo muito errado aqui! Observo que você está usando: dm.Query1 := ... dentro de um procedimento na classe Tdm Esta é a classe do tal dm que apareceu ali em cima e que é uma variável que provavelmente já está criada (ou você criou o datamodule antes de usá-lo, ou deixou no auto-create de seu projeto) Logo, se dm já existe, e Query1 faz parte dele (como sugere a mesma linha ali em cima), então você não teria que alocá-lo dinamicamente como aparentemente está tentando fazer. Da mesma forma, não há porque você querer desalocá-lo. Mas se por acaso este Query1, seja uma variável no na sua unit (e não um componente adicionado ao datamodule), então, você poderia sim fazer a alocação e liberação dinamicamente. Nesta situação, voce continuaria em erro, pois você deveria utilizar o Create de classe em questão (TQuery) e não o da variável que supostamente ainda não foi inicializada (e ainda que estivesse, continuaria errado) Ainda outra questão, seria que você só pode atribuir alguma coisa a qualquer propriedade de um objeto, depois que ele está alocado. Logo, não poderia estar acessando a propriedade Database de Query1, se o suposto Create dela seria executado na linha seguinte. Para a primeira situação (componente Query1 no datamodule), o código teria esta cara: procedure Tdm.tblCadProBeforePost(DataSet: TDataSet); begin if not tblCadPro.FieldByName('PROCOD').IsNull then Exit; Query1.DatabaseName := tblCadPro.DatabaseName; Query1.SQL.Clear; Query1.SQL.Add('SELECT MAX (PROCOD) FROM ESTAPRO.dbf'); Query1.Open; try tblCadPro.FieldByName('PROCOD').AsString := FloatToStr(StrToFloat(Query1.Fields[0].AsString)+1); finally Query1.Close; end; end; Para a segunda situação (variável Query1 declarada na unit/dm), o código teria esta cara: procedure Tdm.tblCadProBeforePost(DataSet: TDataSet); begin if not tblCadPro.FieldByName('PROCOD').IsNull then Exit; Query1 := TQuery.Create(Self); Query1.DatabaseName := tblCadPro.DatabaseName; try Query1.SQL.Add('SELECT MAX (PROCOD) FROM ESTAPRO.dbf'); Query1.Open; try tblCadPro.FieldByName('PROCOD').AsString := FloatToStr(StrToFloat(Query1.Fields[0].AsString)+1); finally Query1.Close; end; finally Query1.Free; end; end; Abraços -
Gabriel T., utilize um TQRComposit. Veja este post, apenas remova o if..then, porque no seu caso não há condição para a inclusão da segunda cópia. Este tópico também lhe será útil. Abraços
-
Silva_henry, como não há driver para progress disponibilizado com o Delphi, acredito que uma saída seria utilizar um driver ODBC (não encontrei nenhum free - este dá para testar por 15 dias). Caso consiga um, este atrigo (Progress ODBC Driver Guide) explica como configurá-lo (ver cap. 2: Configuring Progress Data Sources). Boa sorte.
-
Lucineide, só para ter certeza de que este tópico está na sessão certa: Você fez (desenvolveu) em Delphi um programa para scanear imagens?
-
Firebird e conexão ADO: erro ao criar Form com tabela ativada
pergunta respondeu ao Duduh_Capixaba de Micheus em Delphi, Kylix
até aqui tudo normal. Isto sugere que possa estar sendo manipulada alguma informação do dataset quando a aplicação é iniciada. Voce experimentou seguir a orientação da mensagem e seguir teclando F7 para verificar onde exatamente o erro ocorreu?Caso seja desviado para o código de algum componente, você pode visualizar a pilha de chamadas a procedimentos (View->Debug Windows->Call Stack) e achar em que ponto do seu programa o evento que gerou o erro foi chamado. São justamente momentos em que qualquer codificação que você possa ter implementado, entrarão em ação. Afinal, este seu programa teste de conexão ADO tem algum código implementado? Abraços -
Jhonas, tenho a impressão de que o colega Flávio Vilela está se referindo a possibilidade de indicar em que etiqueta, do ponto de vista linha/coluna, começar a impressão. Se for, neste caso, mexer com as margens do QuickReport pode não ser a saída. Do ponto de vista da linha inicial até não seria problema, mas quanto a coluna inicial sim. Isso porque mudando a margem esquerda, estaria deixando de fora todas as etiquetas cuja coluna esteja fora desta margem. Pelo menos, considerando que a impressão ocorre de cima para baixo e da esquerda para a direita. É sabido que o QuickReport após a impressão do que quer que seja (se ocupa a pagina ou não), ele sempre ejeta a página inteira. Logo, para um reaproveitamento de parte da página, esta deverá ser reinserida (caso das folhas avulsas) ou recarregada (ou reload, caso dos formulários contínuos). Talvez fosse interessante o colega Fávio dar mais detalhes de como construiu seu relatório de etiquetas. Abraços
-
É possível fazer um select com agrupamento?
pergunta respondeu ao Duduh_Capixaba de Micheus em Demais Bancos
Apesar de na prática existirem situações em que isto acaba sendo usado, em termos de normatização do banco de dados (ref. Wikipedia), isto seria eliminado quando a estrutura de seu banco está de acordo com a 4FN (4ª Forma Normal) - um exemplo do link citado: Abraços -
O problema é exatamente o mesmo que tentei explicar anteriormente, entretanto, neste caso, seria no campo Browsing path que você deveria incluir o caminho faltante. Você faz isto, clicando no botão [...] que está presente ao lado da caixa de listagem na tela que indiquei antes. Ao clicar nele, aparece outra tela onde você verá os paths listados na linha daquele combobox, só que na forma de um listbox (cada path em uma linha). Então, para o caminho que estiver faltando, você deve usar o botão [...] que aparece nesta tela, para acessar a caixa de seleção de diretórios e selecioná-lo. Depois, é só utilizar o botão Add para acrescentá-lo a lista. Esta lista deveria estar listando o path de todos os componentes instalados com o seu Delphi (são várias linhas começando com $(BDS)\... ) Veja se não é por aí o seu problema. Após você conseguir finalmente compilar seu pacote de componentes, é possível que posteriormente, para usá-lo você também tenha que acrescentar o path do source dele nesta lista - você saberá disto, se houver erro na compilação dos seus projetos. Abraços
-
A dúvida não necessariamente reside em programaçao Delphi, mas em todos os casos...O que você precisa fazer é o que provavelmente já lhe passou pela cabeça: "para não deixar matricular um aluno em duas turmas, preciso verificar se ele já não está em alguma turma antes da sua inclusão" Como fazer isto? Pode ser usando uma instrução SQL (usando uma query); pode ser utilizando um FindKey (usando uma table) que possua índice pelo código do aluno; Ou ainda, utilizando um Locate (usando tanto query quanto table). Seria conveniente você informar que banco de dados está utilizado e os componentes de acesso ao banco. complicado... o interesse é seu. ;) Abraços
-
É possível fazer um select com agrupamento?
pergunta respondeu ao Duduh_Capixaba de Micheus em Demais Bancos
Duduh_Capixaba, por acaso nesta sua tabela você tem a mesma descrição para códigos diferentes, é isto? -
Só uns pitacos por aqui... biakeffer, por acaso você não mexeu nas configurações dos diretórios em Tools->Environment Options->Delphi Options->Libray - Win32->Library Path?A princípio o pacote rtl.dcp fica na pasta C:\Arquivos de programas\Borland\BDS\3.0\lib e no local que citei, normalmente está "$(BDS)\lib; ....". por mais esta, parece que você realmente andou mexendo nas configurações dos paths... Como o colega Jhonas disse, está no lugar certo.E pelo fato de a unit compilada (system.dcu) também ficar na pasta lib, parece que você realmente mexeu com os paths. Logo, o caminho pode ser verificar isto e tentar corrigir. Se não estou enganado, ao clicar na setinha para baixo na caixa de listagem do campo Library Path, que citei inicialmente, você poderá selecionar uma configuração anteriormente utilizada neste campo e com isso recuperar seu valor original. Espero que possa ser uma pista para a solução do seu problema Abraços
-
não é gambiarra não. É um jeito de fazer. Se fossem poucas opções (combinações), seria viável criar uma configuração de banda para cada opção e habilitar/desabilitar as bandas de acordo com a opção. Mas, na situação que você coloca, não tem jeito não. Se quer fazer algo apresentável, vai ter trabalho sim. Abraços
-
É possível fazer um select com agrupamento?
pergunta respondeu ao Duduh_Capixaba de Micheus em Demais Bancos
Duduh_Capixaba, acho que você consegue o que quer utilizando o distinct no select. Quando você usa ele, apenas uma linha (considerando todas as colunas solicitadas) será retornada, sem que haja repetição de qualquer resultado. Ou seja, basta que uma coluna mude para que a linha seja retornada. Neste caso você não vai usar o group by: SELECT distinct CODIGO, DESCRICAO, REFERENCIA, PRECO1, ESTOQUE FROM CDPRODU ORDER BY DESCRICAO a palavra aparece apenas uma única vez, logo após o select. Para buscar o campo de outra tabela, você utiliza o Join Abraços -
Camila Farias, você poderia explicar melhor a situação?Este GroupBox por acaso está inicialmente oculto e deve aparecer ao apertar um botão? Seria isto?
-
Como calcular um campo Matricula no Delphi
pergunta respondeu ao fabiojcorreia de Micheus em Delphi, Kylix
fabiojcorreia, não dá para opinar muita coisa. Mas, aparentemente na tabela em que você está gravando a informação, você está tentando acessar um campo com um nome que não existe nela, provavelmente você está usando algo como FieldByName('CL_ID')..., algo assim. Seria mais apropriado que você postasse a parte do código onde ocorre o erro. Entretanto, pelo que você pretende implementar, pela sugestão dada e pelo nome do campo que você disse inicialmente a ser incrementado - CL_MATRICULA, parece mesmo que você tenha entendido mal o exemplo, já que ao que parece o campo a ser incrementado deveria ser CL_MATRICULA. Dê uma revisada. Abraços -
Instrução Sql não mostra dados em condição
pergunta respondeu ao robinhocne de Micheus em Delphi, Kylix
robinhocne, nesta caso faça o mais lógico que seria simplesmente perguntar se não é fim do arquivo (caso em que a consulta seria nula) para então fazer as atribuições - não tem porque utilizar um while: ... if not QryAgenda.Eof then begin if (QryAgenda.FieldByName('Bloqueado').AsInteger = 0) then begin TEdit( FindComponent( 'Al' + IntToStr ( y ) + IntToStr ( z ) ) ).Text:= '**********'; end else begin TEdit( FindComponent( 'Al' + IntToStr ( y ) + IntToStr ( z ) ) ).Text:= StrZero(QryAgenda.fieldByName('Aluno').AsInteger,6); TEdit( FindComponent( 'Ct' + IntToStr ( y ) + IntToStr ( z ) ) ).Text:= QryAgenda.fieldByName('Categoria').AsString; end; end; ... e como você executa a consulta (query) apenas na condição: if TpsvBorderLabel(FindComponent( 'Hor' + ... then, a alteração acima deverá ser colocada dentro do bloco begin...end deste if porque, eventualmente, pode ocorrer de você numa passagem ter aberto a consulta e numa próxima passagem, ao não validar o primeiro if, passar para o próximo (do código acima) com a consulta aberta e executar o procedimento incorretamente. Quanto a pesquisar o erro, sugiro que você ponha um break na atribuição que ocorre quando Bloqueado deveria retornar 0 - se nem sequer parar no break, é sinal de que sua consulta não está retornando este valor. Voce vai precisar achar uma pista do problema porque, aparentemente não há algo visivelmente errado. Abraços