Discussão do artigo "SQL e MQL5: Trabalhando com Banco de Dados SQLite" - página 2

 

Devido a alterações na estrutura de cópia - arquivo ByteImg.mqh corrigido para usar a união

Faça o download do novo FastFile em sua publicação https://www.mql5.com/ru/forum/6291#comment_4967832
Arquivos anexados:
ByteImg.mqh  6 kb
 
 string query="SELECT COUNT(*) FROM '"+table+"' WHERE low<"+lowLevel+" AND high>"+highLevel+" AND date>'"+TimeToString(time)+"'";

if(sql3.Query(tbl,query)!=SQLITE_DONE)

        {

         Print(sql3.ErrorMsg());

         return 0.0;

        }

      sql3.Disconnect();

      CSQLite3Cell cell;

      tbl.Cell(0,0,cell);

      int gg=cell.GetInt64();


Embora se a consulta for inserida diretamente no banco de dados, ela produzirá o valor correto.

E se, em vez de COUNT, colocar alguma coluna e, em seguida, observar o tamanho da matriz ArraySize(tbl.m_data), tudo estará certo. Ou seja, o count não funciona. Não sei, talvez eu esteja fazendo algo errado.....

 
é melhor passar o ano inteiro.
 
O próprio cvera funciona. Ou estou obtendo o resultado do lugar errado ou a classe que passa o consultador para o banco de dados não funciona corretamente.
 

No momento, estou enfrentando esse erro. Alguém pode me ajudar?

Arquivos anexados:
Immagine.jpg  268 kb
 
d.bignotti:

No momento, estou enfrentando esse erro. Alguém pode me ajudar?

Obrigado por postar

correção no arquivo

 

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Discussão do artigo "SQL e MQL5: trabalhando com o banco de dados SQLite"

Denis Kanapis, 2017.06.11 15:28

 string query="SELECT COUNT(*) FROM '"+table+"' WHERE low<"+lowLevel+" AND high>"+highLevel+" AND date>'"+TimeToString(time)+"'";

if(sql3.Query(tbl,query)!=SQLITE_DONE)

        {

         Print(sql3.ErrorMsg());

         return 0.0;

        }

      sql3.Disconnect();

      CSQLite3Cell cell;

      tbl.Cell(0,0,cell);

      int gg=cell.GetInt64();


O gg sempre gera 0. Embora se você inserir a consulta diretamente no banco de dados, ele gera o valor correto.

E se, em vez de COUNT, colocar alguma coluna e, em seguida, observar o tamanho da matriz ArraySize(tbl.m_data), tudo estará certo. Ou seja, o count não funciona. Não sei, talvez eu esteja fazendo algo errado.....


A mesma coisa - COUNT produz 0, mas quando você executa o script do SQLiteStuido - tudo conta.

Na prática, descobrimos que isso acontece em tabelas com ~10000>número deStrokes. Além disso, se a tabela tbl obtida, como no exemplo acima, for impressa (por uma função incorporada ao código), as colunas do tipo INTEGER serão impressas com 0, embora não sejam 0, é claro. E na mesma impressão, DOUBLE é impresso corretamente.

Parece que algo está errado com os ints(ainda não tive tempo de testá-lo).

 

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Discussão do artigo "SQL e MQL5: Trabalhando com o banco de dados SQLite"

BeforeFlight, 2017.08.31 07:55 AM


A mesma coisa - COUNT produz 0, mas ao executar um script do SQLiteStuido - tudo conta.

Praticamente descobri que isso acontece em tabelas com ~10000>número deStrokes. Além disso, se a tabela tbl obtida, como no exemplo acima, for impressa (por uma função incorporada ao código), as colunas do tipo INTEGER serão impressas com 0, embora não sejam 0, é claro. E na mesma impressão, DOUBLE é impresso corretamente.

Parece que algo está errado com os ints(ainda não tive tempo de testá-lo).


Eu o encontrei no arquivo "Include\MQH\Ctrl\ByteImg.mqh":

em vez de:

int ViewInt() { __int d; d.v=0; ViewArray(d.b,0,4); return(d.v); }

aparentemente significava:

int ViewInt() { __int d={0}; ViewArray(d.b,0,4); return(d.v); }

depois disso, tudo está correto com o COUNT e a impressão das tabelas. Pelo menos meus testes foram aprovados.

@o_o @Denis Kanapis

 
BeforeFlight:

Encontrei-o: no arquivo "Include\MQH\Ctrl\ByteImg.mqh":

em vez de:

aparentemente significava:

Depois disso, tudo está correto com o COUNT e a impressão das tabelas. Pelo menos meus testes foram aprovados.

@o_o @Denis Kanapis


Só queria informá-lo sobre esse erro, você estava à minha frente :). Para valores INT, o valor 0 foi dado o tempo todo.

 

você descreveu um bug para SD, porque __int é uma união

union __int { int v; uchar b[4]; };

e a diferença entre

__int d; d.v=0;

и

__int d={0};

não deveria haver diferença entre e

O fragmento de código que você mostra não entende como isso afeta seu COUNT de forma alguma.

porque a função ViewInt não escreve, mas exatamente o oposto - ela lê o número em d.v. E não se importa com o valor atual de d.v.

-----

Adicionei a edição sugerida ao ByteImg para que você se sinta mais confortável.


Mas, por favor, localize e forneça uma reimpressão desse bug. Até o momento, tudo parece ser um bug, mas definitivamente não é um bug da biblioteca.