HI,
Estou fazendo um site usando Asp.Net com MySQL, e cada tabela tem a sua classe no sistema, e em cada classe tem o método Manutenção para inserir/atualizar e o método Excluir. Só que o excluir é repetitivo em cada classe: delete from tabela where campo = 1, por exemplo. A única coisa que muda é a tabela e o campo. Então pensei em fazer uma procedure genérica onde eu passasse como parâmetro o nome da tabela , o campo da condição e o código do registro a ser excluído. No Oracle eu já sabia que tem com montar uma query pra ser execeutada.
Achei a dica aqui
How To have Dynamic SQL in MySQL Stored Procedure
http://stackoverflow.com/questions/190776/how-to-have-dynamic-sql-in-mysql-stored-procedure
Minha procedure ficou assim:
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_excluir_registro`(IN `_NOMETABELA` VARCHAR(50), IN `_CAMPO` VARCHAR(50), IN `_VALOR` VARCHAR(50))
BEGIN
SET @s = CONCAT('DELETE FROM ',_NOMETABELA, ' WHERE ', _CAMPO, ' = ', _VALOR);
PREPARE stmt FROM @s;
EXECUTE stmt;
END
Fiquem na Paz!!!!
Mostrando postagens com marcador query. Mostrar todas as postagens
Mostrando postagens com marcador query. Mostrar todas as postagens
segunda-feira, abril 01, 2013
terça-feira, setembro 04, 2012
Obter o valor de um campo no RowCommand do GridView
HI,
Se tiver outra maneira eu desconheço.
Obter o valor de um campo da query no RowDataBound é tranquilo, mas eu precisei de valores que não aparecem no gridview quando uma linha é selecionada.
No GridView faço assim:
string cod_associado = ((DataRowView)e.Row.DataItem)["COD_ASSOCIADO"].ToString();
Vi que existe a propriedade DataKeyNames no gridview e fui pesquisar no google como utilizá-lo.
Achei essa páginas
ASP .NET - Manutenção de dados com GridView e Ajax
http://www.macoratti.net/11/09/aspn_gdvm.htm
GridViewCommandEventArgs
http://forums.asp.net/t/1033685.aspx
Get DataKey values in GridView RowCommand
http://stackoverflow.com/questions/2818203/get-datakey-values-in-gridview-rowcommand
Consegui montar esse código
protected void gdvTurmas_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Select")
{
GridViewRow row = gdvTurmas.Rows[Convert.ToInt32(e.CommandArgument)];
string cod_associado = gdvTurmas.DataKeys[row.RowIndex].Values[0].ToString();
Session["CODASSOC"] = cod_associado;
}
}
Se for pra pegar um valor que tá visível no grid, no evento RowCommand, é assim:
row.Cells[4].Text
Fiquem na Paz!!!
Se tiver outra maneira eu desconheço.
Obter o valor de um campo da query no RowDataBound é tranquilo, mas eu precisei de valores que não aparecem no gridview quando uma linha é selecionada.
No GridView faço assim:
string cod_associado = ((DataRowView)e.Row.DataItem)["COD_ASSOCIADO"].ToString();
Vi que existe a propriedade DataKeyNames no gridview e fui pesquisar no google como utilizá-lo.
Achei essa páginas
ASP .NET - Manutenção de dados com GridView e Ajax
http://www.macoratti.net/11/09/aspn_gdvm.htm
GridViewCommandEventArgs
http://forums.asp.net/t/1033685.aspx
Get DataKey values in GridView RowCommand
http://stackoverflow.com/questions/2818203/get-datakey-values-in-gridview-rowcommand
Consegui montar esse código
protected void gdvTurmas_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Select")
{
GridViewRow row = gdvTurmas.Rows[Convert.ToInt32(e.CommandArgument)];
string cod_associado = gdvTurmas.DataKeys[row.RowIndex].Values[0].ToString();
Session["CODASSOC"] = cod_associado;
}
}
Se for pra pegar um valor que tá visível no grid, no evento RowCommand, é assim:
row.Cells[4].Text
Fiquem na Paz!!!
quinta-feira, agosto 02, 2012
Obter o texto de um item da listview no Android
HI,
Precisei pegar o texto do item selecionado na listview. Ela é alimentada por uma query e o _id é o contador da linha.
Usei esse dica
String s =(String) ((TextView) view.findViewById(R.id.myNr)).getText();
Que achei aqui
Android, Custom ListAdapter get TextView-Text
http://stackoverflow.com/questions/1724937/android-custom-listadapter-get-textview-text/1724951#1724951
Fiquem na Paz!!!
Precisei pegar o texto do item selecionado na listview. Ela é alimentada por uma query e o _id é o contador da linha.
Usei esse dica
String s =(String) ((TextView) view.findViewById(R.id.myNr)).getText();
Que achei aqui
Android, Custom ListAdapter get TextView-Text
http://stackoverflow.com/questions/1724937/android-custom-listadapter-get-textview-text/1724951#1724951
Fiquem na Paz!!!
terça-feira, junho 26, 2012
Update a partir de uma select no Oracle
HI,
Passei a vida toda apenas utilizando o select/insert para popular uma tabela a partir do resultado de uma consulta. Mas ontem precisei além de inserir, também atualizar. Não queria executar a query duas vezes para fazer isso, um select/insert para inserir e um loop em outra query para atualizar.
Sabia que no MySql tem esse recurso de inserir se não existir, e se existir, atualizar. Então fui perguntar ao Google como fazer isso no Oracle. Descobri que existe o comando MERGE, que serviria para o meu propósito.
Comando MERGE
http://psoug.org/reference/merge.html
Agora vou relatar os problema que enfrentei para conseguir executá-lo.
Eu modifiquei a procedure e passou a ocorrer esse erro: ORA-00918: column ambiguously.
Passei um bom tempo para achar esse erro, já que analisando a query não via nenhum problema aparente já que todos os campos estavam precedidos por aliases. Ex:. a.id = b.id.
Pesquisando no google vi que o problema era a repetição de um campo na select. É que antes no select/insert, existiam dois campos que recebiam o mesmo valor: Insert into teste(id, viagens1, viagens2) select id, viagens, viagens from teste2.
Foi aqui que achei a solução para o problema ORA-00918: column ambiguously no MERGE
https://forums.oracle.com/forums/thread.jspa?messageID=10327846
Outro problema que enfrentei foi esse: ORA-30926: unable to get a stable set of rows in the source tables.
No teste para identificar se o registro existe ou não, coloquei apenas 1 campo e minha chave primaria possui 3 campos.
Achei a solução aqui
http://stackoverflow.com/questions/2337271/ora-30926-unable-to-get-a-stable-set-of-rows-in-the-source-tables
Um outro erro que acontece é se colocar um campo da chave primaria no update para ser atualizado.
Fiquem na Paz!!!
Passei a vida toda apenas utilizando o select/insert para popular uma tabela a partir do resultado de uma consulta. Mas ontem precisei além de inserir, também atualizar. Não queria executar a query duas vezes para fazer isso, um select/insert para inserir e um loop em outra query para atualizar.
Sabia que no MySql tem esse recurso de inserir se não existir, e se existir, atualizar. Então fui perguntar ao Google como fazer isso no Oracle. Descobri que existe o comando MERGE, que serviria para o meu propósito.
Comando MERGE
http://psoug.org/reference/merge.html
Agora vou relatar os problema que enfrentei para conseguir executá-lo.
Eu modifiquei a procedure e passou a ocorrer esse erro: ORA-00918: column ambiguously.
Passei um bom tempo para achar esse erro, já que analisando a query não via nenhum problema aparente já que todos os campos estavam precedidos por aliases. Ex:. a.id = b.id.
Pesquisando no google vi que o problema era a repetição de um campo na select. É que antes no select/insert, existiam dois campos que recebiam o mesmo valor: Insert into teste(id, viagens1, viagens2) select id, viagens, viagens from teste2.
Foi aqui que achei a solução para o problema ORA-00918: column ambiguously no MERGE
https://forums.oracle.com/forums/thread.jspa?messageID=10327846
Outro problema que enfrentei foi esse: ORA-30926: unable to get a stable set of rows in the source tables.
No teste para identificar se o registro existe ou não, coloquei apenas 1 campo e minha chave primaria possui 3 campos.
Achei a solução aqui
http://stackoverflow.com/questions/2337271/ora-30926-unable-to-get-a-stable-set-of-rows-in-the-source-tables
Um outro erro que acontece é se colocar um campo da chave primaria no update para ser atualizado.
Fiquem na Paz!!!
terça-feira, maio 10, 2011
Exibir dados a partir de uma procedure
HI,
Hoje tive uns probleminhas para exibir o resultado de uma procedure. Um cliente criou uma procedure para retornar os dados dos clientes. Nunca tinha usado isso no Delphi. Criei rapidinho uma tela para exibir esse resultado em um componente grid.
O primeiro problema que tive, e que recorri ao google, foi quando tentei setar o componente TStoredProc para true. Deu o seguinte erro: error creating cursor handle. Pesquisando no google, descobrir que só posso dá um StoredProc1.ExecProc;. Pois bem, associei um datasource ao componente StoredProc1 e em runtime, executei o ExecProc e não mostrou nada no grid. Aí pensei, deve ser por que esse troço só serve para executar comandos que não retornam dados. Foi aí que tive a idéia de dar um select na procedure e usar o componente query.
Ficou assim: Select * from Nome_Procedure. Dei um open e mostrou os resultados no Grid. Mas aí surgiu o segundo problema. Em algumas colunas tava mostrando (BYTES) ao invés do valor do campo.
Coloquei um Label para receber o conteúdo de campo, mas não mostrou nada. Label.caption := Query.FieldByName('codigo').AsString;
Fui a procura de uma rotina para converter de bytes para integer e achei esse código.
Fiz uma adaptação e criei essa função:
function BytesToInteger(Campo: TField): integer;
var MyBuffer : ^integer;
begin
with Campo do
begin
GetMem(MyBuffer, DataSize);
try
if not GetData(MyBuffer) then
result := 0
else
result := MyBuffer^;{ Do something with the data };
finally
{ Free the space }
FreeMem(MyBuffer, DataSize);
end;
end;
end;
Testei na tela e exibiu em um label o código correto, fiquei animado. Depois eu modifiquei a consulta para converter para float, com o resultado, desanimei. Mostrou o resultado em notação científica. Se eu fosse tentar resolver isso ia ficar muito complicado o código, cheio de conversões.
Foi aí que eu tive a idéia de tratar isso na query, fazendo um type cast.
A query tava assim
select codigo, nome, limite from EXPCLIENTES
Modificando a query
select cast(codigo as integer) codigo, nome, cast(limite as double precision) limite from EXPCLIENTES
Passou a apresentar corretamente os campos no Grid.
Espero que possa ser útil.
Fiquem na Paz
Marcadores:
bde,
bytes,
delphi,
query,
storedprocedure
Assinar:
Postagens (Atom)