OOP, mql5'te şablonlar ve makrolar, incelikler ve kullanım teknikleri - sayfa 28

 
Maxim Kuznetsov :

Unutmayın, öncelikle SQLite'de alan türleri isteğe bağlıdır ve yazım ve işaretleme konusunda endişelenmenize gerek yoktur. O sadece "Lite" değil

uzun bir sorgu 3-4-5'e bölünebilir :-)

BEGIN TRANSACTION

INSERT INTO myTable VALUES (...); --- тут можно получить PrimaryKey

UPDATE myTable .... ; --- обновить по Primary

UPDATE myTable ...  ; --- ещё...

COMMIT ; --- это если все запросы удачны.. иначе ROLLBACK

bu eski hafızadan, yani sertifikada açıklığa kavuşturmak gerekiyor

Tekrarlanabilir bir sorgu kodu istiyorum, uzun süre google'a gideceğim, veritabanıyla ara sıra çalıştım - bir görev var, googledim, karar verdim - ama başarısız bir veritabanı isteği görmek istiyorum

 
Vladimir Simakov :

Spesifik olarak, göreviniz şöyle bir şey olmalıdır:

 string MakeRequest( string md5txt){
   static ENUM_STATISTICS intIndex[]={ STAT_CONPROFITMAX_TRADES ,
                                       STAT_MAX_CONPROFIT_TRADES ,
                                       STAT_CONLOSSMAX_TRADES ,
                                       STAT_MAX_CONLOSS_TRADES ,
                                       STAT_DEALS ,
                                       STAT_TRADES ,
                                       STAT_PROFIT_TRADES ,
                                       STAT_LOSS_TRADES ,
                                       STAT_SHORT_TRADES ,
                                       STAT_LONG_TRADES ,
                                       STAT_PROFIT_SHORTTRADES ,
                                       STAT_PROFIT_LONGTRADES ,
                                       STAT_PROFITTRADES_AVGCON ,
                                       STAT_LOSSTRADES_AVGCON };
   string ret="INSERT INTO \" TesterStatistics \" + StringFormat(" set md5= %d ,md5txt),
   for ( int i= 0 ,ii= 0 ;i<= STAT_LOSSTRADES_AVGCON ;++i){
      ret+=",";
       if (i==intIndex[ii]){
         ret+= StringFormat ("%s = %d,",EnumToString((ENUM_STATISTICS)i),( int ) TesterStatistics (( ENUM_STATISTICS )i) ));
         ++ii;}
       else ret+= StringFormat ("%s =%G",EnumToString((ENUM_STATISTICS),i), TesterStatistics (( ENUM_STATISTICS )i));}
   return ret;}
   
DatabaseExecute (handleDB, MakeRequest("md5txt"));

düzenlemek için daha fazla parantez bulunan küçük düzeltme :-)
ana fikir GÜNCELLEME x DEĞERLER () değil, UPDATE x SET ad1=değer1,ad2=değer2 kullanmaktır. Veritabanının yapısı değiştiğinde ve alanların numaralandırma sırasına bağlı olmadığında sorgunun doğru çalışması için

 

bu kod gibi bir şey var (veritabanından metin alanlarını okudum ve numaralandırmaya dönüştürmek istiyorum)

 class MyClass
{
public :
   enum A            {Aq, Aw, Ae, Ar, At, Ay};
   enum B            {Bq, Bw, Be};
   enum C            {Cq, Cw, Ce, Cr};

   static bool        txtToEnumA( const string txt, A &result);
   static bool        txtToEnumB( const string txt, B &result);
   static bool        txtToEnumC( const string txt, C &result);
};
//+------------------------------------------------------------------+
static bool MyClass::txtToEnumA( const string txt, A &result)
{
   for ( int i = 0 ; i <= ( int )A::Ay; i++)
   {
       if ( StringCompare ( EnumToString ((A)i), txt) == 0 )
      {
         result = (MyClass::A)i;
         return ( true );
      }
   }
   return ( false );
}
//+------------------------------------------------------------------+
static bool MyClass::txtToEnumB( const string txt, B &result)
{
   for ( int i = 0 ; i <= ( int )B::Be; i++)
   {
       if ( StringCompare ( EnumToString ((B)i), txt) == 0 )
      {
         result = (MyClass::B)i;
         return ( true );
      }
   }
   return ( false );
}
//+------------------------------------------------------------------+
static bool MyClass::txtToEnumC( const string txt, C &result)
{
   for ( int i = 0 ; i <= ( int )C::Cr; i++)
   {
       if ( StringCompare ( EnumToString ((A)i), txt) == 0 )
      {
         result = (MyClass::C)i;
         return ( true );
      }
   }
   return ( false );
}
//+------------------------------------------------------------------+
void OnStart ()
{
   MyClass::A a;
   MyClass::B b;
   MyClass::C c;
   string txt[] = { "Aq" , "Bw" , "No" };

   if (MyClass::txtToEnumA(txt[ 0 ], a)) Print (txt[ 0 ], " in A = " , EnumToString (a));
   else Print ( "Error, " , txt[ 0 ], " not in A" );

   if (MyClass::txtToEnumB(txt[ 1 ], b)) Print (txt[ 1 ], " in B = " , EnumToString (b));
   else Print ( "Error, " , txt[ 1 ], " not in B" );

   if (MyClass::txtToEnumC(txt[ 2 ], c)) Print (txt[ 2 ], " in C = " , EnumToString (c));
   else Print ( "Error, " , txt[ 2 ], " not in C" );
}
//+------------------------------------------------------------------+

2020.09.01 18:59:02.593 tst (EURUSD,M5) A'da Ak = Kova

2020.09.01 18:59:02.593 tst (EURUSD,M5) B'de Bw = Bw

2020.09.01 18:59:02.593 tst (EURUSD,M5) Hata, C'de Değil

her şey çalışıyor, ancak soru yine en uygun kodda:

txtToEnumA() , txtToEnumB() , txtToEnumC() yerine yazmanın herhangi bir yolu varsa

bir şablon yöntemi ( şablon )

enum'da farklı sayıda eleman sorunu

 

Ve eğer böyle bir numaralandırma varsa:

 enum A            {Aq= 10 , Aw= 9 , Ae= 8 , Ar= 7 , At= 6 , Ay= 5 };

?

 
Dmitry Fedoseev :

Ve eğer böyle bir numaralandırma varsa:

?

numaralandırmanın öğelerini numaralandırmak bir soru değil, ne vereceği belli değil

Numaralı değil, sadece 4 listem var

sorun şu ki, numaralandırmalara yeni öğeler eklemek isteyebilirim - kodumda NOT'a aşırı öğeler ekleyeceğim - kod işe yarayacak - Bu kodun hantallığını sevmiyorum


ancak tüm durumlar için bir tür evrensel koddan bahsetmiyoruz, şablondaki mevcut görevlere ihtiyacınız var


Not: numaralandırmalardan kurtulamayacaksınız - verileri hem kaynak kodda hem de veritabanında aynı şekilde okuyabilmem ve veritabanında bazı alanları ellerimle düzeltmek isteyebilirim .... genel olarak, her şey uygundur

 
Igor Makanu :

numaralandırmanın öğelerini numaralandırmak bir soru değil, ne vereceği belli değil

Sadece 4 ilanım var, numaralandırılmamış

sorun şu ki, numaralandırmalara yeni öğeler eklemek isteyebilirim - kodumda NOT'a aşırı öğeler ekleyeceğim - kod işe yarayacak - Bu kodun hantallığını sevmiyorum


ancak tüm durumlar için bir tür evrensel koddan bahsetmiyoruz, şablondaki mevcut görevlere ihtiyacınız var


Not: numaralandırmalardan kurtulamayacaksınız - verileri hem kaynak kodda hem de veritabanında aynı şekilde okuyabilmem ve veritabanında bazı alanları ellerimle düzeltmek isteyebilirim .... genel olarak, her şey uygundur

hemen global bir dizi yapın ve onu { EnumToString(x) , x } çiftleriyle doldurun

struct StringID {

   string str;

   int id;

};

StringID IDS[];

ve şablonlara ihtiyaç duyulmaz.
 
Maxim Kuznetsov :

hemen global bir dizi yapın ve onu { EnumToString(x), x } çiftleriyle doldurun

struct StringID {

   string str;

   int id;

};

StringID IDS[];

ve şablonlara ihtiyaç duyulmaz.

Sürümünüz benimkinden çok farklı değil, aynı zamanda hantal ve kodda değişiklik varsa dizileri düzenlemeniz gerekecek

 

dileğimi şöyle çözdü:

 class MyClass
{
public :
   enum A            {Aq, Aw, Ae, Ar, At, Ay};
   enum B            {Bq, Bw, Be};
   enum C            {Cq, Cw, Ce, Cr};
   template < typename T>
   static bool        txtToEnum( const T LastElement, const string txt, T &result);
};
//+------------------------------------------------------------------+
template < typename T>
static bool MyClass::txtToEnum( const T LastElement, const string txt, T &result)
{
   for ( int i = 0 ; i <= ( int )LastElement; i++)
   {
       if ( StringCompare ( EnumToString ((T)i), txt) == 0 )
      {
         result = (T)i;
         return ( true );
      }
   }
   return ( false );
}
//+------------------------------------------------------------------+
void OnStart ()
{
   MyClass::A a;
   MyClass::B b;
   MyClass::C c;
   string txt[] = { "Aq" , "Bw" , "No" };

   if (MyClass::txtToEnum(MyClass::Ay, txt[ 0 ], a)) Print (txt[ 0 ], " in A = " , EnumToString (a));
   else Print ( "Error, " , txt[ 0 ], " not in A" );

   if (MyClass::txtToEnum(MyClass::Be, txt[ 1 ], b)) Print (txt[ 1 ], " in B = " , EnumToString (b));
   else Print ( "Error, " , txt[ 1 ], " not in B" );

   if (MyClass::txtToEnum(MyClass::Cr, txt[ 2 ], c)) Print (txt[ 2 ], " in C = " , EnumToString (c));
   else Print ( "Error, " , txt[ 2 ], " not in C" );

}
//+------------------------------------------------------------------+

2020.09.01 22:08:47.417 tst (EURUSD,M5) A'da Ak = Kova

2020.09.01 22:08:47.417 tst (EURUSD,M5) B'de Bw = Bw

2020.09.01 22:08:47.417 tst (EURUSD,M5) Hata, C'de Değil



more, LastElement'i tanıtmamak için tanımlar, ancak genel olarak kod zaten daha kompakttır

 
Her türlü şeyi yazmak için kaç şeye ihtiyacınız var?