Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Tenho uma página chamada Ficha.aspx onde tem um datagrid, conforme o código abaixo:
<asp:datagrid id="grdBrowse" runat="server" Width="100%" BorderWidth="1px" BackColor="White" BorderColor="Gray" AllowPaging="true" AlternatingItemStyle-BackColor="#C0C0C0" Font-Size="10px" Font-Name="Arial" OnPageIndexChanged="PageChange" PagerStyle-HorizontalAlign="Center" PagerStyle-Mode="NextPrev" DataKeyField="inFichaId" AutogenerateColumns="False" PagerStyle-PageButtonCount="10" AlternatingItemStyle-Font-Size="11" AlternatingItemStyle-Font-Name="Arial"headerstyle-Font-Size="14" headerstyle-Font-Bold="true" headerstyle-Font-Name="Arial" HeaderStyle-ForeColor="GrayText" HeaderStyle-Font-Underline="false" cellpadding="1" Font-Names="Arial" OnItemDataBound="BrowseItemDataBound" OnDeleteCommand="BrowseDelete" PageSize="20" AllowSorting="true">
<SelectedItemStyle ForeColor="#3366FF"></SelectedItemStyle>
<EditItemStyle Font-Size="10px" Font-Names="Arial" Font-Bold="true" ForeColor="White" BackColor="#00CCFF"></EditItemStyle>
<AlternatingItemStyle Font-Size="10px" Font-Names="Arial" BackColor="White"></AlternatingItemStyle>
<headerStyle Font-Size="11px" Font-Names="Arial" Font-Bold="true" CssClass="LABELTEXTBOX" BackColor="Silver" Font-Underline="false"></headerStyle>
<Columns>
<asp:BoundColumn DataField="inNumeroIni" ReadOnly="true" headerText="Número Inicial" SortExpression="inNumeroIni">
<headerStyle HorizontalAlign="Right"></headerStyle>
<ItemStyle HorizontalAlign="Right"></ItemStyle>
</asp:BoundColumn>
<asp:BoundColumn DataField="inNumeroFim" ReadOnly="true" headerText="Número Final" SortExpression="inNumeroFim">
<headerStyle HorizontalAlign="Right"></headerStyle>
<ItemStyle HorizontalAlign="Right"></ItemStyle>
</asp:BoundColumn>
<asp:BoundColumn DataField="dtPedido" ReadOnly="true" headerText="Data Operação" DataFormatString="{0:dd/MM/yyyy}" SortExpression="dtPedido">
<headerStyle HorizontalAlign="Center"></headerStyle>
<ItemStyle HorizontalAlign="Center"></ItemStyle>
</asp:BoundColumn>
<asp:BoundColumn DataField="dtEntrega" ReadOnly="true" headerText="Data Entrega" DataFormatString="{0:dd/MM/yyyy}" SortExpression="dtEntrega">
<headerStyle HorizontalAlign="Center"></headerStyle>
<ItemStyle HorizontalAlign="Center"></ItemStyle>
</asp:BoundColumn>
<asp:BoundColumn DataField="stObs" ReadOnly="true" headerText="Observação" SortExpression="stObs">
<headerStyle HorizontalAlign="Center"></headerStyle>
<ItemStyle HorizontalAlign="Center"></ItemStyle>
</asp:BoundColumn>
<asp:ButtonColumn Text="<img SRC=images/bt_grid_edit.gif Border=0 alt='Alterar';" CommandName="Select">
<headerStyle Width="20px"></headerStyle>
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle"></ItemStyle>
</asp:ButtonColumn>
<asp:ButtonColumn Text="<img SRC=images/bt_grid_del.gif Border=0 alt='Excluir'
onclick="return confirm('Tem certeza que deseja excluir?')" Width=19 Height=15>" CommandName="Delete">
<headerStyle Width="20px"></headerStyle>
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle"></ItemStyle>
</asp:ButtonColumn>
</Columns>
<PagerStyle NextPageText="<img SRC=images/bt_grid_next_pg.gif Border=0 Width=19 Height=15>"
PrevPageText="<img SRC=images/bt_grid_prev_pg.gif Border=0 Width=19 Height=15>" HorizontalAlign="Center"></PagerStyle>
</asp:datagrid>
Ao clicar na coluna observação para fazer a ordenação ele apresenta a seguinte mensagem de erro: Conversion failed when converting datetime from character string.
Só que esse campo stobs não é datetime e sim string (e varchar no banco), os outros ordena normal..
No load da pagina eu chamo essa funçao BindBrowse que popula o grid
Código da página ficha.aspx.vb
Private Sub BindBrowse()
grdBrowse.DataSource = CSClasse.Lista(ViewState("fichaSortExpr"))
grdBrowse.DataBind()
grdBrowse.SelectedIndex = -1
No SortCommand deveria ordenar mas quando eu clico no campo observação da essa mensagem de erro:
Protected Sub grdBrowse_SortCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridSortCommandEventArgs) Handles grdBrowse.SortCommand
Dim newSortExpr As String = e.SortExpression
ViewState("fichaSortExpr") = newSortExpr
BindBrowse()
End Sub
Código da CSClasse.vb, a função que chama a procedure que lista os campos no datagrid
Public Shared Function Lista(Optional ByVal order As String = "") As DataSet
Dim cnn As New SqlConnection()
cnn.ConnectionString = _stStringConexao
Dim cmd As New SqlCommand("st_procedure", cnn)
With cmd
.CommandText = "st_procedure"
.CommandType = CommandType.StoredProcedure
.Parameters.Add("@order", SqlDbType.VarChar).Value = order
End With
Dim adp As New SqlDataAdapter(cmd)
Dim sdr As New DataSet()
adp.Fill(sdr, "lista")
cnn.Close()
Return CType(sdr, DataSet)
End Function
Código da st_procedure que é chamada para popular os campos e fazer a ordenação:
ALTER procedure [dbo].[st_procedure]
(@order varchar(500) = null)
as begin
select inFichaId , stDescricao = 'de ' + convert(varchar, inNumeroIni) + ' à ' + convert(varchar, inNumeroFim), f.inNumeroIni, f.inNumeroFim ,dtPedido, dtEntrega, stObs from ficha where inAtivo= 1
order by
case @order
when 'inNumeroIni' then inNumeroIni
when 'inNumeroFim' then inNumeroFim
when 'dtPedido' then dtPedido
when 'dtEntrega' then dtEntrega
when 'stObs' then stObs
else inFichaId
end
Novamente conto com a ajuda de vocês
>
Boa NOite
é bem provável que o problema esteja no fato do tipo de campo ser diferente, digo provável poi nunca tive esse problema, e ficaria dificil eu simular isso aqui agora, mas tentarei e posto o que aconteceu pois além de tudo sou muito curioso
Uma forma que você pode resolver isso, se o problema estiver no tipo de campo é você converter os campos do order by para nvarchar tb usando a função convert,
No caso da data você vai ter que converter para o formato yyyyMMddHHmmss que deixa a data ordena mesmo estando em string, pois se converter direto fica
todos os dias 01, depois todos os dias 02 e por aí vai assim
01/01
01/02
02/01
02/02
quando por ordem de data seria
01/01
02/01
01/02
02/02
tenta usar a procedure como abaixo , a mudança tá só no order by
ALTER procedure [dbo].[st_procedure]
(@order varchar(500) = null)
as begin
select inFichaId , stDescricao = 'de ' + convert(varchar, inNumeroIni) + ' à ' + convert(varchar, inNumeroFim), f.inNumeroIni, f.inNumeroFim ,dtPedido, dtEntrega, stObs from ficha where inAtivo= 1
order by
case @order
when 'inNumeroIni' then inNumeroIni
when 'inNumeroFim' then inNumeroFim
when 'dtPedido' then convert(nvarchar, dtPedido, 112)
when 'dtEntrega' then convert(nvarchar,dtEntrega, 112)
when 'stObs' then stObs
else inFichaId
end
QQ coisa é só postar , se der certo ou errado
Abraços
Só que por esses campos datetime ta ordenando, o problema esta ocorrendo com o campo stObs que é um varchar(500), por isso que estou achando estranho.
não funcionou ???
>
não funcionou ???
não funcionou
os campos de data ta certo sao datetime mesmo e estao ordenando certo, o campo que nao ordena e da essa mensagem de erro é um campo tipo varchar que é o campo stOBS
tentei assim:
order by
case @order
when 'inNumeroIni' then inNumeroIni
when 'inNumeroFim' then inNumeroFim
when 'dtPedido' then dtPedido
when 'dtEntrega' then dtEntrega
when 'stObs' then convert(nvarchar,stObs)
else inFichaId
end
mas nao funcionou, segue a estrutura da tabela, o campo que esta apresentando o problema é somente o destacado em vermelho.
/applications/core/interface/imageproxy/imageproxy.php?img=http://img59.imageshack.us/img59/5649/tbficha.jpg&key=3c0d55da2b62955e95ab9dce90df17315ba9adf53f0b2f999bf33b53bcddce67" alt="tbficha.jpg" />
Obrigada pela ajuda q tem dado, aguardo resposta
o convert que eu coloquei foi nos campos datetime para transformar eles em nvarchar
tenta colocar um try..catch para pegar a mensagem de erro que o sql retorna...
>
o convert que eu coloquei foi nos campos datetime para transformar eles em nvarchar
tenta colocar um try..catch para pegar a mensagem de erro que o sql retorna...
o erro que da no sql é exatamente o titulo do post: "Conversion failed when converting datetime from character string."
quando passo para o parametro @order o valor 'stOBS'
vou procurar um jeito de testar aqui e posto
abraços
>
vou procurar um jeito de testar aqui e posto
abraços
obrigada pela disposição em ajudar /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/biggrin.gif&key=cb0fdb2382312b39ddcb15831fcae62157015f17d2417528782628663387e929" alt="biggrin.gif" />
Vamos lá cintiadel, acho que temos uma solução
Simulei o erro em uma base SQL Server 2005, minha base da NF eletrônica
usei esse sql abaixo inicialmente
nessa tabela tenho
demi - datetime
dsaient - datetime
qvol - int
cancelar - int
natop - nvarchar
declare @ordem nvarchar(30)
set @ordem = 'natop'
select * from bdnfe2.nfe.nfeide order by
case @ordem
when 'demi' then demi
when 'dsaient' then dsaient
when 'qvol' then qvol
when 'natop' then natop
when 'cancelar' then cancelar end
o erro ocorre na mesma situação que a sua, quando classifico pelo campo texto (nvarchar)
Msg 241, Level 16, State 1, Line 7
Conversion failed when converting datetime from character string.
dai fiz a modificação inicial que eu havia proposto e deu erro novamente
deu o erro de conversão do tipo novamente mas com uma mensagem diferente
declare @ordem nvarchar(30)
set @ordem = 'natop'
select * from bdnfe2.nfe.nfeide order by
case @ordem
when 'natop' then natop
when 'demi' then convert(nvarchar,demi, 112)
when 'dsaient' then convert(nvarchar,dsaient, 112)
when 'qvol' then qvol
when 'cancelar' then cancelar end
Msg 245, Level 16, State 1, Line 7
Conversion failed when converting the nvarchar value 'Retorno de mercadoria depositada em depósito fechado ou arma' to data type int.
Daí resolvei fazer a conversão explicita de todos os campo para nvarchar assim
declare @ordem nvarchar(30)
set @ordem = 'natop'
select * from bdnfe2.nfe.nfeide order by
case @ordem
when 'natop' then convert(nvarchar, natop)
when 'demi' then convert(nvarchar,demi, 112)
when 'dsaient' then convert(nvarchar,dsaient, 112)
when 'qvol' then convert(nvarchar,qvol)
when 'cancelar' then convert(nvarchar,cancelar) end
e deu certo, ou seja, aparentemente o problema está em usar tipos diferente no order by..
aí você me pergunta, mas por que só dá no varchar?? eu te respondo, boa pergunta que eu vou pesquisar na biblioteca do msdn, quando eu tiver tempo, e posto aqui, ou no blog que estou tentando montar faz meses mas meu projeto de nota fiscal eletrônica não deixa, kkkk, onde eu postar vou avisar
em resumo , a solução é você fazer a converção explicita de todos os campos para um tipo único..
se liga que quando converter o tipo datetime, a função fica diferente ok
se der certo avisa
Abraços
>
Vamos lá cintiadel, acho que temos uma solução
Simulei o erro em uma base SQL Server 2005, minha base da NF eletrônica
usei esse sql abaixo inicialmente
nessa tabela tenho
demi - datetime
dsaient - datetime
qvol - int
cancelar - int
natop - nvarchar
declare @ordem nvarchar(30)
set @ordem = 'natop'
select * from bdnfe2.nfe.nfeide order by
case @ordem
when 'demi' then demi
when 'dsaient' then dsaient
when 'qvol' then qvol
when 'natop' then natop
when 'cancelar' then cancelar end
o erro ocorre na mesma situação que a sua, quando classifico pelo campo texto (nvarchar)
Msg 241, Level 16, State 1, Line 7
Conversion failed when converting datetime from character string.
dai fiz a modificação inicial que eu havia proposto e deu erro novamente
deu o erro de conversão do tipo novamente mas com uma mensagem diferente
declare @ordem nvarchar(30)
set @ordem = 'natop'
select * from bdnfe2.nfe.nfeide order by
case @ordem
when 'natop' then natop
when 'demi' then convert(nvarchar,demi, 112)
when 'dsaient' then convert(nvarchar,dsaient, 112)
when 'qvol' then qvol
when 'cancelar' then cancelar end
Msg 245, Level 16, State 1, Line 7
Conversion failed when converting the nvarchar value 'Retorno de mercadoria depositada em depósito fechado ou arma' to data type int.
Daí resolvei fazer a conversão explicita de todos os campo para nvarchar assim
declare @ordem nvarchar(30)
set @ordem = 'natop'
select * from bdnfe2.nfe.nfeide order by
case @ordem
when 'natop' then convert(nvarchar, natop)
when 'demi' then convert(nvarchar,demi, 112)
when 'dsaient' then convert(nvarchar,dsaient, 112)
when 'qvol' then convert(nvarchar,qvol)
when 'cancelar' then convert(nvarchar,cancelar) end
e deu certo, ou seja, aparentemente o problema está em usar tipos diferente no order by..
aí você me pergunta, mas por que só dá no varchar?? eu te respondo, boa pergunta que eu vou pesquisar na biblioteca do msdn, quando eu tiver tempo, e posto aqui, ou no blog que estou tentando montar faz meses mas meu projeto de nota fiscal eletrônica não deixa, kkkk, onde eu postar vou avisar
em resumo , a solução é você fazer a converção explicita de todos os campos para um tipo único..
se liga que quando converter o tipo datetime, a função fica diferente ok
se der certo avisa
Abraços
Até funcionou embora eu não entenda pq como você disse...rsrs
Mas olha como ficou a ordenação pelo inNumeroID (campos do tipo int)
/applications/core/interface/imageproxy/imageproxy.php?img=http://img715.imageshack.us/img715/668/ordenacaopornumero.jpg&key=6c186c0edc46cf65fa5a0c4e999c91cd72f3094c8993ae3fd70f449689fa5ff8" alt="ordenacaopornumero.jpg" />
isso era esperado, até comentei em um post anterior
é que a classificação é diferente do números quando se trata de um string, ou como número, no seu cao apesar de 140000 ser maior que 16100, como string ele vem antes..
o que fiz uma vez pra contornar esse tipo de problema...
no vba tinha uma função chamada string, que repetia uma string, um determinado número de vezes, ela ajuda muito com essa questão de zeros no inicio como 00150, que em int fica 150.
fiz uma function pro sql server que faz isso
ALTER function [dbo].[sTRING] ( @texto char(1), @caracteres int) returns varchar(8000)
begin
declare @contador int
declare @novotexto varchar(8000)
set @contador = 0
set @novotexto = ''
while @contador < @caracteres
begin
set @novotexto = @novotexto + @texto
set @contador = @contador + 1
end
return @novotexto
end
falta tratar algumas coisas nela principalmente reacionadas à erros
ela no caso funciona assim
select dbo.string 5, 'a'
retorna - aaaaa
a sua sql ia ficar meio louca, mas acho que resolveria o problema da classificação, antes de uma solução mais elaborada...
você teria que colocar zeros na frente do número para deixá-los com o mesmo número de caracteres
tem tratar pra deixar assim que aí
0000140000
0000016100
0000016416
0000300000
0000050000
olha só enquanto eu postava surgiu uma situação no trabalho, à tarde posto como ficaria o sql completo vlw
nao tem como fazer como o converte da data?
no vb possuii a função format que faria esse trabalho "sujo", mas não achei no sql server algo semelhante..
mas dando uma pesquisada, achi um tutorial aqui do imasters que aparentemente resolve seu problema nesse link
Espero que ajude e desculpe a demora
Se der certo ou errado é só postar
Boa NOite
é bem provável que o problema esteja no fato do tipo de campo ser diferente, digo provável poi nunca tive esse problema, e ficaria dificil eu simular isso aqui agora, mas tentarei e posto o que aconteceu pois além de tudo sou muito curioso
Uma forma que você pode resolver isso, se o problema estiver no tipo de campo é você converter os campos do order by para nvarchar tb usando a função convert,
No caso da data você vai ter que converter para o formato yyyyMMddHHmmss que deixa a data ordena mesmo estando em string, pois se converter direto fica
todos os dias 01, depois todos os dias 02 e por aí vai assim
01/01
01/02
02/01
02/02
quando por ordem de data seria
01/01
02/01
01/02
02/02
tenta usar a procedure como abaixo , a mudança tá só no order by
ALTER procedure [dbo].[st_procedure]
(@order varchar(500) = null)
as begin
select inFichaId , stDescricao = 'de ' + convert(varchar, inNumeroIni) + ' à ' + convert(varchar, inNumeroFim), f.inNumeroIni, f.inNumeroFim ,dtPedido, dtEntrega, stObs from ficha where inAtivo= 1
order by
case @order
when 'inNumeroIni' then inNumeroIni
when 'inNumeroFim' then inNumeroFim
when 'dtPedido' then convert(nvarchar, dtPedido, 112)
when 'dtEntrega' then convert(nvarchar,dtEntrega, 112)
when 'stObs' then stObs
else inFichaId
end
QQ coisa é só postar , se der certo ou errado
Abraços