cintiadel 0 Denunciar post Postado Janeiro 21, 2011 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 Compartilhar este post Link para o post Compartilhar em outros sites
Daniel LM Costa 2 Denunciar post Postado Janeiro 22, 2011 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 Compartilhar este post Link para o post Compartilhar em outros sites
cintiadel 0 Denunciar post Postado Janeiro 24, 2011 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. Compartilhar este post Link para o post Compartilhar em outros sites
Daniel LM Costa 2 Denunciar post Postado Janeiro 24, 2011 não funcionou ??? Compartilhar este post Link para o post Compartilhar em outros sites
cintiadel 0 Denunciar post Postado Janeiro 24, 2011 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. Obrigada pela ajuda q tem dado, aguardo resposta Compartilhar este post Link para o post Compartilhar em outros sites
Daniel LM Costa 2 Denunciar post Postado Janeiro 24, 2011 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... Compartilhar este post Link para o post Compartilhar em outros sites
cintiadel 0 Denunciar post Postado Janeiro 26, 2011 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' Compartilhar este post Link para o post Compartilhar em outros sites
Daniel LM Costa 2 Denunciar post Postado Janeiro 26, 2011 vou procurar um jeito de testar aqui e posto abraços Compartilhar este post Link para o post Compartilhar em outros sites
cintiadel 0 Denunciar post Postado Janeiro 27, 2011 vou procurar um jeito de testar aqui e posto abraços obrigada pela disposição em ajudar Compartilhar este post Link para o post Compartilhar em outros sites
Daniel LM Costa 2 Denunciar post Postado Janeiro 27, 2011 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 Compartilhar este post Link para o post Compartilhar em outros sites
cintiadel 0 Denunciar post Postado Janeiro 27, 2011 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) Compartilhar este post Link para o post Compartilhar em outros sites
Daniel LM Costa 2 Denunciar post Postado Janeiro 27, 2011 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 Compartilhar este post Link para o post Compartilhar em outros sites
cintiadel 0 Denunciar post Postado Janeiro 31, 2011 nao tem como fazer como o converte da data? Compartilhar este post Link para o post Compartilhar em outros sites
Daniel LM Costa 2 Denunciar post Postado Fevereiro 1, 2011 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 Compartilhar este post Link para o post Compartilhar em outros sites