Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. Xafam, mas a informação que vem desta view não é atualizada em algum lugar?Fazendo uma cópia dela, você não terá que de tempo em tempo compará com a original? E como vai ficar as alterações que você pretende fazer nesta sua cópia? Elas poderão ser perdidas. Pense a respeito. A cópia em si, poderá ser feita com a instrução SELECT INTO (Sintax SELECT - ref. msdn - SQL Server Developer Center): select * into TAB_FROM_VIEW18 from VIEW18Esta instrução irá criar uma tabela chamada TAB_FROM_VIEW18 no seu banco de dados, com a mesma estrutura e dados retornados pela VIEW18. A princípio você irá criar/copiar estes dados apenas uma única vez (depende das respostas aos questinamentos anteriores). Se for mesmo uma única vez, pessa a algum desses seu colegas "sacanas", ou quem administra o banco, para que execute esta instrução no front-end, pois não justificaria colocar isto em um programa. Abraços
  2. Saulo Souto, não é provável que possa ser feito. Observe o que diz o help a respeito do KeyField: KeyField identifies the field in the ListSource dataset that must match the value of the DataField field. traduzindo... KeyField identifica o campo no dataset ListSource que deve combinar com o valor do campo DataField e sabendo-se que a propriedade DataField só pode conter a indicação de um único campo do DataSet ligado a propriedade DataSource, acho que podemos afirmar que não dá para fazer uso de KeyField da forma como você pretende. Abraços
  3. Observe o que você postou... e o que eu já havia comentado... Resolvi fazer a pesquisa para você, mas não achei muita coisa em português não. Inicialmente, para você pelo menos saber com o que está lidando, seria interessante ler estes dois pequenos artigos:- Introdução a Views (ref. DevMedia) - Usando Views (ref. iMasters) Se você quiser encontrar uma alternativa, deve saber do que se trata uma View. E especificamente sobre as restrições que eu havia comentado, neste artigo (em inglês) - Views in SQL Server 2000 - encontrei algumas informações: Update data There are some restrictions for updating data through a view. * A view cannot modify more than one table. So if a view is based on two or more tables, and you try to run a DELETE statement, it will fail. If you run an UPDATE or INSERT statement, all columns referenced in the statement must belong to the same table. * It’s not possible to update, insert or delete data in a view with a DISTINCT clause. * You cannot update, insert or delete data in a view that is using GROUP BY. * It’s not possible to update, insert or delete data in a view that contains calculated columns. Also be aware of columns that cannot contain NULL. If it has no default value, and is not referenced in the view, you will not be able to update the column. basicamente: - Uma view não pode alterar mais que uma tabela. Assim, se uma view for baseada em um select com duas ou mais tabelas e você tentar executar um DELETE, ele falhará. Se executar um UPDATE ou INSERT, todas as colunas referenciadas (nestes comandos) devem pertencer a mesma tabela (não funciona se forem colunas de tabelas diferentes); - Não é possível atualizar, inserir ou excluir dados em uma view que tenha a cláusula DISTINCT; - Voce não pode atualizar, inserir ou excluir dados em uma view que esteja usando GROUP BY; - Não é possível atualizar, inserir ou excluir dados em uma view que tenha colunas calculadas (que usam: SUM, COUNT,...) Caso em algum lugar do código ou documentação você não encontre o SQL de criação da VIEW, voce deve usar o front-end (ou ferramenta de gerenciamento do banco) para descobrir com que instrução SELECT foi criada a VIEW. Assim, você poderá confirmar que ela não está podendo ser atualizada devido a sua construção. Procure saber mais a respeito. Como você já deve ter percebido, uma VIEW não é exatamente uma TABELA. Alternativas com certeza haverão. Entretanto, acredito que isto pode depender das características do seu sistema e acho pouco provável que eu possa lhe ajudar.Se atualmente você edita esta view em um DBGrid, talvez seja necessário utilizar outra tela para as atualizações, acessando os dados especificamente na tabela (não através view). Aparentemente, neste assunto, parece que você não tem muita experiência. Então, procure alguém mais próximo de você para lhe ajudar - alguém que possa olhar o projeto/banco junto com você. Abraços e boa sorte.
  4. Parabéns pela promoção Andreia - agora ninguém segura mais ela. Sai da frente!!!! :D Ao Renato e Beraldo, obrigado pelo tempo dispendido em prol da comunidade e parabéns pelo trabalho realizado. ;) kuroi, você já tá querendo derrubar a moça?! Ela virou Administradora. :P
  5. a versão é mesmo esta? Está estranho, porque no SourceForge a última versão disponível é: JCL 1.102 Build 3072 (30-07-2008)e a última JVCL: JVCL 3.34 release (30-07-2008) Verifique se você está com as versões atualizadas, porque a JVCL "depende" da JCL - é recomendado utilizar as ultimas versões de ambas, para garantir compatibilidade... ...e, apesar de não ter sido apresentado o conteúdo da linha, este tipo de erro parece ter relação com algum tipo de declaração que anteriormente aparecia de um modo e agora estaria aparecendo de outro. Abraços
  6. Este tipo de problema, foi solucionado justamente pela adição da imagem com o código para postagem dos visitantes - ficou 100% é... parece que houveram renovações (percebi que temos brasões novos) :) sendo possível, isto é realmente muito ruim. pois é..., nisto vocês estão certos mas, sem ter o IPB, o máximo que eu poderia oferecer é o que disse antes sobre avaliar os QUOTE inicial e final no post e seria coisa para programador php. Mas, para não dizer que não estive pesquisando sobre o assunto, eu encontrei este post sobre algo "similar" (quantidade mínima de palavras) no Forum Invision Help? onde há o link para download do MOD. O código do MOD e as intruções de instação, indicam que a alteração poderia ser realizada no arquivo sources/classes/post/class_post.php, logo após a parte em que aparece: //----------------------------------------- // Do we have a valid post? //----------------------------------------- e a introdução de um código meio fuleiro, como este, talvez pudesse funcionar: //----------------------------------------- // Negar posts quotados //----------------------------------------- // verifica que não está no modo visualização if ( !$_POST['preview'] ) { // separamos cada palavra do texto no TextArea - Post $post_words = explode(" ", trim($this->ipsclass->my_br2nl($_POST['Post']))); // quote inicial normalmente será [quote <usuário>...] e não apenas [quote] // verificar a primeira e última palavras não é o melhor método, mas cobre os casos comuns if (stristr($post_words[0], "[quote") && (stristr($post_words[count($post_words) -1], "[/quote]")) { $this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'no_permission') ); } }Obs: apesar de em 2006 já haverem postado sobre esta mesma dúvida, nenhum MOD foi citado e o pessoal ainda estaria sem solução. Entretanto... ... conhecendo também outra velha discussão, este é um assunto que provavelmente continuará morto, exceto se resolverem mesmo fechar os tópicos resolvidos (o que também fui/sou contra). Valeu pela atenção.
  7. Norivan Oliveira, não leve a mal, mas já estive deste lado do forum e sei que não é bem assim - você vai perceber com o tempo... Este assunto já rolou na sessão da administração e está ainda sem solução. É só para dar uma "chaqualhada" e ver se sai alguma coisa desta "caixa preta".
  8. Xafam, acho que você não está meio perdido, e se perde mais ainda ao seguir o código que já estava no botão. :wacko: Olhe bem as duas primeiras linhas do bloco de quatro que você usa para "salvar" a informação... Percebe que coisa meio estranha é chamar o método Edit seguido do Post? O método Edit coloca o dataset em edição e o Post grava estas alterações no banco. Então, a lógica diz que entre uma operação e outra alguma coisa deveria/poderia ser alterada. Assim, prossivelmente em algum lugar quando o form é mostrado já deve ter sido chamado o método Edit deixando os dados em condições de serem alterados/manipulados pelo usuário que, por fim, ao desejará gravar estas alterações, o que normalmente é feito através de um botão para este fim onde aparece o método Post apenas (eventualmente um commit ou commitretained - dependendo dos componentes usados). parece que você está tentando editar um select realizado sobre uma VIEW e não TABLE. Para os selects sobre um VIEW poderem ser atualizáveis (editáveis), existem algumas restrições. O erro já aponta o uso da palavra reservada TOP nest select - uma das restrições. Pesquise a respeito. E lembre-se de informar que banco de dados está usando, componentes de acesso e no neste caso específico, parece interessante saber se sua consulta está mesmo sendo feita sobre uma view. Isto facilita a vida dos colegas ao tentarem lhe dar sugestões. ;) Abraços
  9. Será que algum dia isto vai ser evitado aqui no forum?! Não parece difícil verificar um tipo de post como este, já que começa com um
  10. Fajo, por gentileza edit seu post e coloque a tag <codigo> [/ CODE] (sem este espaço depois da barra). Um código deste tamanho, sem as tags, não é nada convidativo a uma avalição. ;)
  11. claudyo, eu devo estar ficando cego e você muito desatento. Preste atenção ao seu código no post#16 (e que acabei copiando, ajustando outras coisas e não vi a káka que tinha nele. Vou por sem a tag para poder chamar a atenção ao que quero: Conseguiu ver onde está o problema... ...e veja que InitParam deveria estar deste modo: procedure Tdm.InitParam(Param: TParameter; Value: Variant); begin if trim(Value)='' then Param.Value := Null else Param.Value:=Value; end; observe que a procedure deve receber dois parâmetros e note também de que tipo eles devem ser. estou postando ele devidamente corrigido aqui e, com certeza, erro de compilação não terá mais: procedure TfrmCadProd.gravadados; begin with dm.qryCadProd do begin sql.Text:='insert into produto(nome, categoria, tamanho, volume, valor)'+ 'Values (:pNome, :pCategoria, :pTamanho, pVolume, :pValor)'; dm.initParam(Parameters.ParamByName('pNome'), edtNome.Text); dm.initParam(Parameters.ParamByName('pCategoria'), cboCategoria.KeyValue); dm.initParam(Parameters.ParamByName('pTamanho'), edtTamanho.text); dm.initParam(Parameters.ParamByName('pVolume'), edtVolume.text); dm.initParam(Parameters.ParamByName('pValor'), strTocurr(edtValor.text)); Prepared := True; ExecSql; end; end; experimente assim: f VarIsNull(cboCategoria.KeyValue) or VarIsEmpty(cboCategoria.KeyValue) then begin Application.Messagebox('Escolha uma Categoria Para o Produto','Aviso',mb_IconInformation+mb_ok); cboCategoria.SetFocus; exit; end; Abraços
  12. BOm, eu com certeza não poderei lhe ajudar muito, por não usar o Delphi 2007. Mas, esta mensagem sugere que você esteja usando a opção de execução de programa (F9), que não é cabível no seu caso. você deveria usar a opção compilar (CTRL+F9) ou, acessando o menu Project, a opção Build <nome do seu pacote>. O resto da mensagem, não diz nada de relevante, sendo considerada normal em relação a opção que você usou para tentar gerar o pacote. Abraços
  13. Marcos Augusto, sem dúvida você primeiro tem que compilar ele.E se dá erro, é porque algo não está correto e, sendo assim, você não vai conseguir instalá-lo. Logo, você ganharia mais tempo se tentasse encontrar a causa deste erro (que, por sinal, você não citou qual é). Abraços
  14. Boa dica Jose Luiz. Permita-me apenas corrigir o exemplo de modo a corresponder ao caso citado. O nome do campo é apenas Status, já que QueryStatus é o campo da querie adicionado em design-time. Também, como o parâmetro Column oferece a propriedade Field, não se faz necessário acessar o caminho mais longo para o valor do campo: procedure TF_BUS_PROD.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin If Column.FieldName = 'status' then //**** Remova esta linha se você quer destacar toda a linha **** if (Column.Field.AsString = 'Sim' ) then begin dbgrid1.canvas.brush.color := clGray; dbgrid1.DefaultDrawColumnCell ( rect, DataCol, Column, State ); end; obs: 1) neste método apenas deve-se ter cuidado com o tal case-sensitive, ou seja, o nome do campo na string usada no if..then tem que ser igual ao nome constante no field. Na dúvida, algo assim fica mais seguro: If UpperCase(Column.FieldName) = 'STATUS' then 2) apesar de em várias codificações vermos de forma diferente, quando definimos no DBGrid a propriedade DefaultDrawing = False, e não pintamos todo o grid por nossa conta (apenas mudamos algumas propriedades do canvas), o médoto DefaultDrawColumnCell precisa ser chamado apenas uma única vez e no final do procedimento. Abraços
  15. paulo.feitosa, vamos começar do início... Tirando aquela bagunça de [colors], fica mais fácil ver o que você postou e sinceramente não me parece que seja o que você tem no seu código. Se for, sequer está compilando, porque as você está utilizando acento agudo (´) para delimitar as strings, ao invés de aspas simples ('), donde resultaria que seu código teria esta cara: Query1.SQL.ADD('select * from Arquivo') Query1.SQL.ADD('where CAMPO = :paramentro1') Query1.SQL.ADD('order by CAMPO') Entrando na questão do parâmetro, citada pelo colega Duduh_Capixaba, você aparentemente deseja filtrar as informações tendo o CAMPO um valor específico. Pela falta de informação inicial, o colega sugeriu uma passagem de parâmetro de uma forma que não é a aceita pelos componentes da paleta ADO (p.e., params[idx].AsInteger). Neste caso, você deverá tentar da seguinte forma: Query1.Close; Query1.SQL.ADD('select * from Arquivo') Query1.SQL.ADD('where CAMPO = :paramentro1') Query1.SQL.ADD('order by CAMPO') Query1.Parameters[0].Value := <valor a ser filtrado>; Query1.Open;sendo que onde aparece <valor a ser filtrado> deve ser substituido pela origem da informação que você está utilizando - pode ser um Edit onde o usuário digitou o que deseja filtrar. Se for fazer uma filtragem de um campo string, tipo o nome de uma pessoa ao algo similar e desejar que esta busca seja parcial, ou seja, o campo contenha em parte de seu conteúdo o valor sendo filtrado, neste caso você terá que usar LIKE no lugar de "=". É importante lembrar que este ADOQuery deve estar ligada a um Datasouce, que por sua vez está ligado ao DBGrid. Caso contrário, mesmo executando a query, você não vai ver nada. Como o colega Jhonas já citou, há muitos tópicos sobre este assunto aqui no forum, dê uma pesquisada para ver as possibilidades (são várias). Por fim, ainda há a possibilidade de não ser nada do que citei, então, tente dar mais informações, como por exemplo: - qual a mensagem de erro que você recebe? (original - sem tradução); - o erro ocorre ao compilar o programa ou quando já está em execução; - tipo dos campos importantes na avaliação do problema. É este tipo de falta de informação que me fez colocar a pequena nota em destaque na minha assinatura, ali embaixo. :rolleyes: Abraços
  16. Paulo, você seria melhor continuar deste seu outro tópico: http://scriptbrasil.com.br/forum/index.php?showtopic=123737do contrário vira bagunça e que ajuda perde a continuidade das idéias já dadas. ;)
  17. Itamar, aparentemente seu tópico está na sessão errada, já que você usa C++ Builder e aqui tratamos de Delphi. De qualquer modo, acho que a idéia em si, serve para os dois. Voce não citou mas acredito que também utilize a propriedade Proportional = true, caso contrário este Stretch deixará sua imagem distorcida. Supondo isto, você precisará fazer descobrir a escala de redução que você está utilizando para então calcular corretamente a posição. Por exemplo, uma imagem com 800x600 carregada em um image com as dimensões 200x150 (estou facilitando aqui usando a mesma proporção), a escala será de 1/4 (ou, 0,25) e deste modo ao clicar na posição 80x50 do image, voce estará na realidade clicando em uma área de imagem que será calculada pela divisão desta coordenada pela escala: 80/0,25 = 320 50/0,25 = 200 ou seja, você deveria buscar, na imagem, o pixel na posição 320x200 O problema neste seu procedimento é que como você está usando a imagem reduzida, um único pixel visível que será clicado, poderia na verdade representar 4 - levando em conta o exemplo que usei. Veja que ser pegarmos a posição 81x51, teremos: 81/0,25 = 324 51/0,25 = 204 Então, quando se trata de "edição" de pixel, que exige precisão, a melhor opção seria usar o modo zoom (ou simplesmente o tamanho normal da imagem) Abraços
  18. claudyo, mensagem estranha... antes de mais nada, encontrei outro problema com com o seu código, além daquele envolvendo a vírgula. Olhando ele mais uma vez, observei que você informa no insert 5 colunas, mas passa 6 valores (values). :huh: insert into produto(nome, categoria, tamanho, volume, valor) Values (:pNome, :pCategoria, :pTamanho,:pValor,:pVolume, :pValor) veja que tem um parâmetro pvalor sobrando... Faça este ajuste e verifique o resultado. Caso este erro persista, você poderia ainda tentar informar em run-time o tipo de dados dos parâmetros - isto normalmente não é necessário, mas... Eu não sou muito favorável a este médoto de acesso aos parâmetros ou campos (usar o array), porque dá margens a mudanças de ordem deles ou acrécimos, passarem despercebido e gerarem problemas futuros. Mas como a informação do SQL está sendo preparada em run-time e estamos vendo exatamente o que haverá no componente quando ativarmos ele, neste caso, a simplificação me parece mais vantajosa. Assim, sendo, para informar o tipo do parâmetro usamos a propriedade DataType conforme o caso - confira se usei os tipos certos (outros tipos, veja no help): ... Parameters[0].DataType := ftString; // pNome Parameters[1].DataType := ftInteger; // pCategoria Parameters[2].DataType := ftString; // pTamanho Parameters[3].DataType := ftString; // pVolume Parameters[4].DataType := ftFloat; // pValor dm.initParam(Parameters.ParamByName('pNome').Value:=edtNome.Text;) dm.initParam(Parameters.ParamByName('pCategoria').Value:=cboCategoria.KeyValue;) dm.initParam(Parameters.ParamByName('pTamanho').Value:=edtTamanho.text;) dm.initParam(Parameters.ParamByName('pVolume').Value:=edtVolume.text;) dm.initParam(Parameters.ParamByName('pValor').Value:=strTocurr(edtValor.text); ... obs: fazendo uma verificação em design-time, observei que sempre que tentava definir como ftCurrency, ele automaticamente era substituído por ftFloat. Abraços
  19. Frega, desculpe ter esquecido da questão das barrinhas ("|") - me concentrei no negrito e esqueci delas. Vamos resolver o problema de outra maneira... A idéia agora é armazenar na propriedade Data do TreeNode, o campo de referência para buscarmos os dados na sua tabela quando formos desenhar as colunas. Caso este campo fosse um Inteiro, ficaria simples apenas fazermos um type-cast e jogarmos ele direto na propriedade mas, como se trata de um string, precisaremos alocar memória para isto e guardarmos nesta propriedade. Esta abordagem, nos obriga a criar um procedimento para liberação da memória alocada para estas strings e, como no processo de população da árvore, usaremos um procedimento recursivo. Fiz também um upgrade na questão visual, possibilitando que cada coluna possa ser desenhada com um alinhamento específico (catei a rotina de outro código que eu tinha). Veja como ficou o resultado: By micheus at 2008-09-26 Novo link para download do código. Não darei maiores detalhes aqui, porque o código está devidamente comentado e acredito ser suficiente. Qualquer dúvida extra, é só postar. Abraços
  20. Tudo bem, não esquenta não. Eu nem tenho mesmo que cobrar nada - eu é que tenho que me desculpar.É que se você tivesse continuado daquele post, ao invés de ter aberto este, já teríamos ganho um bom tempo e eu poderia estar dando atenção a outro colega. o erro está em não interpretar a mensagem. Veja que ela diz "identificador não declarado" e tendo eu posto ele naquela procedure, por certo que existe em algum lugar a declaração dele. Se você teclar F1 sobre ele, verá que está declarado na unit Variants que é naturalmente declarada na unit do projeto que tem a declaração de um form, mas não na de um datamodule. Logo, basta que você inclua ela na cláusula uses do seu datamodule. E lembre-se, é NULL sem as áspas - com as aspas, você está passando uma string com o texto 'null'. Veja como vai ficar. Abraços
  21. wanderley, desculpe-me mas ainda não ficou claro. De qualquer modo, acredito que você mesmo já consiga colocar dentro do TabSheet o que quer que seja. Se for necessário, talvez ficasse mais claro você postar uma imagem de como você imagina deveria ficar o resultado (use componentes em design-time para criar esta visualização) Abraços
  22. Eder, como diz a mensagem, Printer não é um identificador declarado na classe TQRCompositeReport. Mesmo no quick, o "correto" é utilizar QRPrinter. vai ser necessário chamar o método Prepare do QRCompositeReport antes de gravar o arquivo. Vai parecer uma coisa meio sem sentido, mas como o QRCompositeReport não oferece referência à QRPrinter, você utiliza um dos QuickReps para gravar o arquivo: ... with FormCxTrafegoSint do begin QrDataIni.Caption:=DateToStr(DateTimePicker1.Date); QrDataFin.Caption:=DateToStr(DateTimePicker2.Date); QRCompositeReport1.Prepare; // Aqui a "coisa" estranha - você usa um dos quickrep para salvar todo o relatório QuickRep1.QRPrinter.Save((ExtractFilePath(Application.ExeName))+'REL\' + DateRel + '.QRP'); QRCompositeReport1.PREVIEW; ... (vamos usar o with .. do para simplificar ;) - sendo que se todo este procedimento estiver justamente neste form, então você pode omitir ele.) Obs: O preview não é obrigatório - você só precisa chamar ele se for realmente mostrar o relatório na tela para o usuário. Antes que me perguntem de onde tirei isto, foi do arquivo QuickReport FAQ, o qual já fiz referência neste post, ano passado. Eis o que constava lá: Q. How can we save a composite report to a file (*.QRP) from source code? (We can not access a QRPrinter object for Composite Report (seems to be declared 'private')). A. You should be able access the qrprinter by referencing the qrprinter of one of the individual reports in the composite report after you call Prepare. Abraços
  23. wanderley, sê uma olhada neste tópico: Comando Para Criar Componentes.No post#4 tem uma dica referente a criação dinâmica de TabSheet que é a "aba" do PageControl. que tipo de grade? TDBGrid ou TStringGrid? Abraços
  24. claudyo, dê uma olhada nesta linha de seu código:sql.Text:='insert into produto(nome, categoria, tamanho, volume, valor,)'+ Conseguiu ver aquela "," perdida no final da instrução? Hoje encontrei na mina pasta de testes, um código que tinha relação com sua dúvida inicial. Voltando aos meus posts encontrei este: Valor de precisao invalido (05/04/2008), onde havia sugerido uma procedure para a inicialização dos parâmetro procedure InitParam(Param :TParameter; Value :Variant); - Familiar?! Me chateia o fato de termos discutido aqui, uma questão que já foi inicialmente tratada lá, sendo que segui tentando ajudar mas fiquei sem um retorno. É o tipo de coisa que desanima. <_< Abraços
  25. Frega, desculpe a demora em retornar, mas só hoje pude gastar um tempinho para verificar como resolver o problema. A resposta é bem simples, mas se você me perguntar o porque dela, eu não saberei lhe explicar. :blush: No procedimento do evento OnCustomDrawItem, você pode remover a linha: DefaultDraw := False; e acrescente esta linha antes do primeiro TextRect: Sender.Canvas.Font.Color := clBlack; Você poderá usar qualquer cor que quiser, exceto clWindowText - é a utilizada por padrão e que está "gerando" o negrito. Esta a a parte que você não deve me perguntar o porque. ;) se você utilizar os botoezinhos do form de edição fica bem fácil - ele só lhe pedirá a url - é o primeiro botão após a caixa de lista das "carinhas". Abraços
×
×
  • Criar Novo...