Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069

Считывание с txt и запись в ado

27.11.2014, 20:54. Показов 2719. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добро всем!
в тхт файле у меня порядка 1000 строк с шапкой, вот в таком виде:
PHP
1
2
3
Сумма      Ф.И.О.                Адрес -кв                        № платежа             Дата      
300          Абрамович          Весенняя 2/2-15               23125                    11.11.2014
150          Кац                    Гагарина 32-18                  1284                    11.11.2014
считываю и заношу в переменные так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Form1->ADOQuery1->RecNo=a;
str->LoadFromFile(ExtractFilePath(Application->ExeName)+"reestr\\Реестр.txt");
AnsiString kv="",fam="",adr="",sum="",Pn,Pdd=""; // Day переменная для выдергивания даты в шапку после разноски реестра
int i=0;
for(int m=0;m<str->Count;m++)     
{
i=0;
kv="";fam="";adr="";sum="";Pn="";Pdd="";
for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]==(int)' ') break;
  else sum+=str->Strings[m].c_str()[i];
  }
  for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]!=(int)' ') break;
  }
for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]==(int)' ') break;
  else fam+=str->Strings[m].c_str()[i];
  }
for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]!=(int)' ') break;
  }
for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]==(int)'/') adr+="-";
  else
  {
  if((int)str->Strings[m].c_str()[i]==(int)'-') break;
  else adr+=str->Strings[m].c_str()[i];
  }
  }
i++;
for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]==(int)' ') break;
  else kv+=str->Strings[m].c_str()[i];
  }
 
for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]!=(int)' ') break;
  }
for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]==(int)' ') break;
  else Pn+=str->Strings[m].c_str()[i];
  }
 
for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]!=(int)' ') break;
  }
for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]==(int)' ') break;
  else Pdd+=str->Strings[m].c_str()[i];
  }
проблема в том что иногда первую строку считывает а потом теряет...
Хочу по новой этот код переделать, очень грузит систему
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.11.2014, 20:54
Ответы с готовыми решениями:

Запись в Excel поcредством ADO
Здраствуйте. Подскажите пожалуйста как можно осуществить запись данных в Excel посредством ADO. Уже больше недели рою интернет в...

Считывание текста у txt файла.Прoблема с кириллицой(с кодировкой)(консоль)
Проблема в следующем,когда я создаю txt файл обычным текстовым редактором windows а он используют кодировку Ansi. То когда моя программа...

считывание и запись в файл
здравствуйте! есть прожка на с++ билдер, расчетная, которая выдает одно значение, и есть файл rtf, следующего вида: угол А, угол Б,...

38
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
28.11.2014, 12:57  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от D1973 Посмотреть сообщение
Может быть, есть возможность ограничить кавычками
Файл выгружается из другой программы, и изменить что либо там нет возможности.
Смотрите я вот что придумал и осуществил, в stringgrid отобразил, по моему мнению оттуда его легче разносить по адресам или сохранять в txt в таком виде чтоб легче было обрабатывать, вы как думаете?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
GetCurrentDirectory(500,z);
StringGrid5->Cells[0][0]="Сумма";
StringGrid5->Cells[1][0]="Ф.И.О.";
StringGrid5->Cells[2][0]="Адрес";
StringGrid5->Cells[3][0]="№ платежа";
StringGrid5->Cells[4][0]="Дата";
StringGrid5->Cells[5][0]="ППО";
TStringList*str=new TStringList;
temp=z;
 
temp+="\\reestr\\Реестр.txt";
str->LoadFromFile(temp);
Form1->parsreestr(str,StringGrid5);
for(int i=StringGrid5->RowCount-1;i>1;i--)
{
if(Form1->checknum(StringGrid5->Cells[0][i])==0) StringGrid5->RowCount=StringGrid5->RowCount-1;
 }
Миниатюры
Считывание с txt и запись в ado  
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
28.11.2014, 13:09  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  struct _sAbonent {String Summ, FIO, Address, nPlat, Dt;} Abn;
  TStringList *One = new TStringList;
  TStringList *Two = new TStringList;
  One->LoadFromFile("111.txt");
  for(int i = 1; i < One->Count; i++)
   {
     if(One->Strings[i].Trim().Length() != 0)
      {
        Two->CommaText = One->Strings[i];
        Abn.Summ = Two->Strings[0];
        Abn.FIO = Two->Strings[1];
        Abn.Address = Two->Strings[2] + " " + Two->Strings[3];
        StringReplace(Abn.Address, "/", "-", TReplaceFlags() << rfReplaceAll);
        Abn.nPlat = Two->Strings[4];
        Abn.Dt = Two->Strings[5];
//Вот тут что-то с данными делаешь, в БД добавляешь или что-то еще
//Я для примера в Мемо вывел
        Memo1->Lines->Add(Abn.Summ);
        Memo1->Lines->Add(Abn.FIO);
        Memo1->Lines->Add(Abn.Address);
        Memo1->Lines->Add(Abn.nPlat);
        Memo1->Lines->Add(Abn.Dt);
        Memo1->Lines->Add("&&&&&&&&&&&&&&&");
//----------------------------------------
      }
   }
  delete One;
  delete Two;
}
то что нужно спасибо!
0
Модератор
 Аватар для D1973
9954 / 6490 / 2461
Регистрация: 21.01.2014
Сообщений: 27,496
Записей в блоге: 3
28.11.2014, 13:46
Цитата Сообщение от Samrisbe Посмотреть сообщение
то что нужно
Да вот, к сожалению, не совсем...
К примеру, в моем городе сплошь и рядом встречаются улицы типа "Карла Маркса", "академика Лавреньтьева" ну и т.д., т.е. с пробелами внутри названия. Это, при использовании моего кода вызовет косяк, о чем сразу упомянул уважаемый SatanaXIII. Тот же косяк вылезет и при указании в поле ФИО фамилии, имени и отчества через пробел...
Нет, конечно, если формат файла именно таков (нет лишних пробелов в названии улиц, нет имени-отчества) - то все тип-топ...
Цитата Сообщение от Samrisbe Посмотреть сообщение
Form1->parsreestr(str,StringGrid5);
А как, если не военная тайна, оформлен этот метод?
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
28.11.2014, 14:04  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
с пробелами внутри названия.
У меня в Базе строго соблюден формат без пробелов:
например ул. Братьев Газдановых записана как - БГаздановых, и ул. Степана Разина еще проще - Разина. тобишь проблемы такой нет, и даже если бы была проблема с пробелами, можно в базе сохранять вместо пробела в базе "_" и при отображении менять на пробел.
Смотри для разноски мне требуется три строки
сумма
адрес
дата
твой пример их считывает идеально!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct _sAbonent {String Summ, Address, Dt;} Abn;
  TStringList *One = new TStringList;
  TStringList *Two = new TStringList;
  One->LoadFromFile("111.txt");
  for(int i = 1; i < One->Count; i++)
   {
     if(One->Strings[i].Trim().Length() != 0)
      {
        Two->CommaText = One->Strings[i];
        Abn.Summ = Two->Strings[0];
        Abn.Address = Two->Strings[2] + " " + Two->Strings[3];
        StringReplace(Abn.Address, "/", "-", TReplaceFlags() << rfReplaceAll);
        Abn.Dt = Two->Strings[5];
я сейчас работаю непосредственно над разноской, и как будет результат я напишу сюда чтоб вы посмотрели нет ли там грубых ошибок. Спасибо!

Добавлено через 7 минут
Цитата Сообщение от D1973 Посмотреть сообщение
А как, если не военная тайна, оформлен этот метод?
нет не тайна, скорей стыдно показывать...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
AnsiString temp="";
AnsiString vrem="";
bool ff=0;
grid->RowCount=str->Count;
int num=-1;
num++;
char q=' ';
for(int count=1,row=1,col=0;count<str->Count;count++)
{
      temp=str->Strings[count].c_str()[0];
      if(temp=="1"||temp=="2"||temp=="3"||temp=="4"||temp=="5"||temp=="6"||temp=="7"||temp=="8"||temp=="9"||temp=="0")
      {
      num=0;
        temp=str->Strings[count];
        for(int z=0;z<str->Strings[count].Length();z++)
        {
         if(temp.c_str()[z])
          {
 
          if(num==2&&(int)temp.c_str()[z]!=(int)q)
          {
          for(int m=z;m<500;m++,z++)
              {
              vrem+=temp.c_str()[z];
              if((int)temp.c_str()[z]==(int)'-') m=501;
              }
          num++;
          }
 
 
 
           if((int)temp.c_str()[z]!=(int)q)
             {
             ff=1;
             vrem+=temp.c_str()[z];
             }
           else
           {
           if(ff==1)
             {
 
           if(num==1)
          {
          for(int m=z;m<500;m++,z++)
              {
              if((int)temp.c_str()[m]==(int)' ' && (int)temp.c_str()[m+1]==(int)' ')
              {
              m=501;
              }
              else vrem+=temp.c_str()[m];
 
              }
 
          }
                 num++;
 
           grid->Cells[col][row]=vrem;
           vrem="";
           col++;
           ff=0;
             }
 
           }
         }
        }
        vrem="";
        col=0;
        row++;
      }
}
0
28.11.2014, 14:11

Не по теме:

Цитата Сообщение от Samrisbe Посмотреть сообщение
скорей стыдно показывать...
"Знаешь, стыдно, когда не видно
Что услышал ты все, что слушал"
А.Башлачев, "...в чистом поле"
Всегда все можно оптимизировать, было бы желание

0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
28.11.2014, 14:42  [ТС]
Разносит тоже кривовато:
Раньше я выделял квартиру, отдельно от адреса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
for(int f=0;f<str1->Count;f++)
      {
       ADOQuery5->SQL->Text="SELECT КодАбон From Абоненты WHERE Квартира="+kv+" AND АдрКод=(Select АдрКод From Адреса Where Адрес='"+str1->Strings[f]+"') AND IsNull(ДатаОтключения)";
       ADOQuery5->ExecSQL();
       ADOQuery5->Open();
       if(ADOQuery5->RecordCount>0)
         {
         fam=ADOQuery5->Fields->Fields[0]->AsString;
         ADOQuery5->SQL->Text="UPDATE Абоненты SET ПоследнийПлатеж=Date(),НаСчету=НаСчету+"+sum+" WHERE Квартира="+kv+" AND АдрКод=(Select АдрКод From Адреса Where Адрес='"+str1->Strings[f]+"')";
         ADOQuery5->ExecSQL();
         ADOQuery5->SQL->Text="INSERT INTO История(КодАбон,Сумма,Дата,Операция,Время) values("+fam+","+sum+",'"+StrToDate(Pdd) +"','Внесение',Time())";
         ADOQuery5->ExecSQL();
         yes=1;
         str1->Clear(); // дописал чтоб не дублировало внесенную сумму
         Form19->ProgressBar1->Step+=000.5;
         }
         ADOQuery5->Close();
       }
if(yes==0) error->Add(str->Strings[m]); // до записываем в string не совпавший платеж
  else yes=0;
этот код я точно хочу в урну отправить, таккак акцесска на одном ПК выскакивает на другом нет...
Как лучше разносить?

Добавлено через 21 минуту
Первый шаг создаем список адресов:
C++
1
2
3
4
5
6
7
8
9
10
TStringList *spisok; // для разноски реестра
ADOQuery1->SQL->Text="SELECT Адрес FROM Адреса ORDER BY Адрес";
ADOQuery1->ExecSQL();
ADOQuery1->Active=true;
ADOQuery1->First();
for(int i=0;i<ADOQuery1->RecordCount;i++)
   {
   spisok->Add(ADOQuery1->Fields->Fields[0]->AsString); //создали стринг со списоком адресов
   ADOQuery1->Next();
   }
Считываем и структурируем данные с реестра:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct _sAbonent {String Summ, Address, Dt;} Abn;
  TStringList *One = new TStringList;
  TStringList *Two = new TStringList;
  One->LoadFromFile("111.txt");
  for(int i = 1; i < One->Count; i++)
   {
     if(One->Strings[i].Trim().Length() != 0)
      {
        Two->CommaText = One->Strings[i];
        Abn.Summ = Two->Strings[0];
        Abn.Address = Two->Strings[2] + " " + Two->Strings[3];
        StringReplace(Abn.Address, "/", "-", TReplaceFlags() << rfReplaceAll);
        Abn.Dt = Two->Strings[5];
      }
   }
осталось найти нужную квартиру и зачислить ей сумму и дату платежа
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
28.11.2014, 15:21
Цитата Сообщение от Samrisbe Посмотреть сообщение
таккак акцесска на одном ПК выскакивает на другом нет...
Вообще-то для того чтобы работать с базой аксеса не обязательно, чтобы был установлен аксес. С таблицей работет изумительно ввод данных, удаление данных выборка. Всё дело в технологии ADО, которая устанавливается при установке Windows.

Добавлено через 1 минуту
Цитата Сообщение от Samrisbe Посмотреть сообщение
ADOQuery1->SQL->Text="SELECT Адрес FROM Адреса ORDER BY Адрес";
ADOQuery1->ExecSQL();
C++
1
ADOQuery1->ExecSQL();//<-- эта строка здесь лишняя
Добавлено через 4 минуты
Цитата Сообщение от Samrisbe Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
for(int f=0;f<str1->Count;f++)
      {
       ADOQuery5->SQL->Text="SELECT КодАбон From Абоненты WHERE Квартира="+kv+" AND АдрКод=(Select АдрКод From Адреса Where Адрес='"+str1->Strings[f]+"') AND IsNull(ДатаОтключения)";
       ADOQuery5->ExecSQL();
       ADOQuery5->Open();
       if(ADOQuery5->RecordCount>0)
         {
         fam=ADOQuery5->Fields->Fields[0]->AsString;
         ADOQuery5->SQL->Text="UPDATE Абоненты SET ПоследнийПлатеж=Date(),НаСчету=НаСчету+"+sum+" WHERE Квартира="+kv+" AND АдрКод=(Select АдрКод From Адреса Where Адрес='"+str1->Strings[f]+"')";
         ADOQuery5->ExecSQL();
         ADOQuery5->SQL->Text="INSERT INTO История(КодАбон,Сумма,Дата,Операция,Время) values("+fam+","+sum+",'"+StrToDate(Pdd) +"','Внесение',Time())";
         ADOQuery5->ExecSQL();
         yes=1;
         str1->Clear(); // дописал чтоб не дублировало внесенную сумму
         Form19->ProgressBar1->Step+=000.5;
         }
         ADOQuery5->Close();
       }
if(yes==0) error->Add(str->Strings[m]); // до записываем в string не совпавший платеж
  else yes=0;
Да и в цикле делать запросы не очень хорошо
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
28.11.2014, 15:33  [ТС]
Цитата Сообщение от Sasha Посмотреть сообщение
Да и в цикле делать запросы не очень хорошо
Согласен Саша, а как грамотно записать эти данные?
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
28.11.2014, 16:29
Цитата Сообщение от Sasha Посмотреть сообщение
str1-
Это адреса?
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
28.11.2014, 17:04  [ТС]
Немного приблизился к результату

C++
1
2
3
4
5
6
7
8
9
10
ADOQuery1->SQL->Text="SELECT Адрес FROM Адреса ORDER BY Адрес";
ADOQuery1->ExecSQL();
ADOQuery1->Active=true;
ADOQuery1->First();
TStringList *Adresa = new TStringList;
for(int i=0;i<ADOQuery1->RecordCount;i++)
  {
  Adresa->Add(ADOQuery1->Fields->Fields[0]->AsString);
  ADOQuery1->Next();
  }
Этот код из базы адреса в таком формате выводит в TStringList *Adresa:
Международная 4 п.7
Международная 4 п.8
Миллера 35 п.2
Мичурина 20 А п.6
Мичурина 20А п.3
Мичурина 20А п.9
Московская 5А п.1
Московская 5А п.3


Далее из файла Реестр.тхт, в таком формате выводим в String сумму адрес квартиру дату:
и получаем вот такой список:
120
иринстонская 68
19
01.03.2014
&&&&&&&&&&&&&&&
160
островского 20
37
03.03.2014
&&&&&&&&&&&&&&&
135
ПОЖАРСКОГО 3
19
03.03.2014


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
struct _sAbonent {String Summ, Address, Kv, Dt;} Abn;
  TStringList *One = new TStringList;
  TStringList *Two = new TStringList;
  TStringList *Pay = new TStringList;
 
 
  Bingo->Add("Совпавшие"); //сюда записываю совпавшие для разноски
  Error->Add("Не совпавшие"); //сюда записываю не совпавшие из файла реестр
 
  One->LoadFromFile(ExtractFilePath(Application->ExeName)+"reestr\\Реестр.txt");
  for(int i = 1; i < One->Count; i++)
    {
     if(One->Strings[i].Trim().Length() != 0)
       {
        Two->CommaText = One->Strings[i];
        Abn.Summ = Two->Strings[0];
        Abn.Address = Two->Strings[2] + " " + Two->Strings[3];
        StringReplace(Abn.Address, "/", "-", TReplaceFlags() << rfReplaceAll);
        Abn.Kv = Two->Strings[4];
        Abn.Dt = Two->Strings[6];
        Pay->Add(Abn.Summ);
        Pay->Add(Abn.Address);
        Pay->Add(Abn.Kv);
        Pay->Add(Abn.Dt);
        Pay->Add("&&&&&&&&&&&&&&&");
       }
    }
Cейчас я делаю структурирование списка адресов из базы и удаление "П." чтобы было полное совпадение двух списков
Осталось сравнить два списка чтоб в случае совпадения вносил оплату в квартиру Kv и дату платежа.
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
28.11.2014, 18:39
Цитата Сообщение от Samrisbe Посмотреть сообщение
ADOQuery1->SQL->Text="SELECT Адрес FROM Адреса ORDER BY Адрес";
ADOQuery1->ExecSQL();
И опять делаешь ошибку!!!!!!!!!!!!!!!!!! Select и ExecSQL() вместе не совместимы
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
29.11.2014, 10:41  [ТС]
Цитата Сообщение от Sasha Посмотреть сообщение
И опять делаешь ошибку!!!!!!!!!!!!!!!!!! Select и ExecSQL() вместе не совместимы
Спасибо исправил, еслиб только в этом была проблема...

Добавлено через 4 часа 42 минуты
Вот так получаю список совпавших платежей:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//для исправления в один формат реестра и адресов в базе
TStringList *One = new TStringList;
TStringList *Two = new TStringList;
TStringList *Pay = new TStringList;
 
//для поиска совпавших
TStringList *Bingo = new TStringList;
TStringList *Error = new TStringList;
 
//читаем с базы
ADOQuery1->SQL->Text="SELECT Адрес FROM Адреса ORDER BY Адрес";
ADOQuery1->Active=true;
ADOQuery1->First();
TStringList *Adresa = new TStringList;
for(int i=0;i<ADOQuery1->RecordCount;i++)
  {
  Adresa->Add(ADOQuery1->Fields->Fields[0]->AsString);
  ADOQuery1->Next();
  }
//переправляем в один формат адреса с базы
struct _sAbresa {String Ulica;} Adr;
  for(int i = 1; i < Adresa->Count; i++)
    {
     if(Adresa->Strings[i].Trim().Length() != 0)
       {
       Two->CommaText = Adresa->Strings[i];
       Adr.Ulica = Two->Strings[0] + " " + Two->Strings[1];
       Pay->Add(Adr.Ulica);
       }
    }
    Adresa->Assign(Pay);
    Adresa->SaveToFile(ExtractFilePath(Application->ExeName)+"reestr\\Список подъездов.txt");
 
One->Clear();
Two->Clear();
Pay->Clear();
 
  Bingo->Add("Совпавшие"); //сюда записываю совпавшие для разноски
  Error->Add("Не совпавшие"); //сюда записываю не совпавшие из файла реестр
 
  //для перевода адресов в верхний регистр для точного сравнения
  AnsiString df;
  AnsiString ds;
//считываем и структурируем реестр
struct _sAbonent {String Summ, Address, Kv, Dt, Nplat;} Abn;
  One->LoadFromFile(ExtractFilePath(Application->ExeName)+"reestr\\Реестр.txt");
  for(int i = 1; i < One->Count; i++)
    {
     if(One->Strings[i].Trim().Length() != 0)
       {
        Two->CommaText = One->Strings[i];
        Abn.Summ = Two->Strings[0];
        Abn.Address = Two->Strings[2] + " " + Two->Strings[3];
        Abn.Kv = Two->Strings[4];
        Abn.Dt = Two->Strings[6];
        Abn.Nplat = Two->Strings[7];
        ds=(AnsiString(Abn.Address)).UpperCase();//пишем в переменную в верхнем регистре
        for(int i = 0; i < Adresa->Count; i++)
          {
          df=(AnsiString(Adresa->Strings[i])).UpperCase();//пишем в переменную в верхнем регистре
          if(df == ds)//ловим совпадение
            {
            //добавляем в StringList адреса с платежами найденные Адресах
            Bingo->Add(Abn.Summ + "    " + Abn.Address + "    " + Abn.Kv + "     " + Abn.Dt + "     " + Abn.Nplat);
            break;
            }
          }
 
        //записываем в файл структурированный реестр
        Pay->Add(Abn.Summ + "    " + Abn.Address + "    " + Abn.Kv + "     " + Abn.Dt + "     " + Abn.Nplat);
       }
    }
следующий этап проверить на совпадение номера квартиры, попробую сделать запрос чито на квартиры.

Добавлено через 11 часов 15 минут
Доброго утра!
Данные с реестра считал, разделил на типы и в цикле занес в переменную.
Код от а до я проходит без проблем, но в таблицу не записывает.
Посмотрите плиз, вроде нет очевидной ошибки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
struct _sAbonent {String Summ, Fio, Address, Kv, Dt, Ops;} Abn;
  One->LoadFromFile(ExtractFilePath(Application->ExeName)+"reestr\\Реестр.txt");
  for(int i = 1; i < One->Count; i++)
    {
     if(One->Strings[i].Trim().Length() != 0)
       {
        Two->CommaText = One->Strings[i];
        Abn.Summ = Two->Strings[0];
        Abn.Fio = Two->Strings[1];
        Abn.Address = Two->Strings[2] + " " + Two->Strings[3];
        Abn.Kv = Two->Strings[4];
        Abn.Dt = Two->Strings[6];
        Abn.Ops = Two->Strings[7];
 
        ds=(AnsiString(Abn.Address)).UpperCase();
        for(int i = 0; i < Adresa->Count; i++)
          {
          df=(AnsiString(Adresa->Strings[i])).UpperCase();
          проверяю на совпадения адресов
          if(df == ds)
            {
            // смотрю правильность данных в переменных
            ShowMessage("Сумма " + Abn.Summ + " Адрес " + Abn.Address + " № кв " + Abn.Kv + " Дата платежа " + Abn.Dt);
            // Данные в переменных сумма фамилия, улица, квартира, дата платежа готовы начинаем разносить
            //открываем нужную квартиру и проверяем стоит ли в графе дата отключения дата, и если нет зачисляем
            ADOQuery5->SQL->Text="SELECT КодАбон From Абоненты WHERE Квартира="+Abn.Kv+" AND АдрКод=(Select АдрКод From Адреса Where Адрес='"+Abn.Address+"') AND IsNull(ДатаОтключения)";
            ADOQuery5->ExecSQL();
            ADOQuery5->Open();
            ShowMessage("Начинаем обновлять !");
            Abn.Fio=ADOQuery5->Fields->Fields[0]->AsString;
            ADOQuery5->SQL->Text="UPDATE Абоненты SET ПоследнийПлатеж=Date(),НаСчету=НаСчету+"+Abn.Summ+" WHERE Квартира="+Abn.Kv+" AND АдрКод=(Select АдрКод From Адреса Where Адрес='"+Abn.Address+"')";
            ADOQuery5->ExecSQL();
 
            ADOQuery5->SQL->Text="INSERT INTO История(КодАбон,Сумма,Дата,Операция,Время) values("+Abn.Fio+","+Abn.Summ+",'"+ StrToDate(Abn.Dt) +"','Внесение',Time())";
           // ADOQuery5->ExecSQL();
            ADOQuery5->Close();
           //сохраняю в файл успешно разнесенные
            Bingo->Add(Abn.Summ + "    " + Abn.Address + "    " + Abn.Kv + "     " + Abn.Dt + "     " + Abn.Ops);
            break;
            }
          }
     }
   }
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
29.11.2014, 10:54
Цитата Сообщение от Samrisbe Посмотреть сообщение
C++
1
2
3
ADOQuery5->SQL->Text="INSERT INTO История(КодАбон,Сумма,Дата,Операция,Время) values("+Abn.Fio+","+Abn.Summ+",'"+ StrToDate(Abn.Dt) +"','Внесение',Time())";
     // ADOQuery5->ExecSQL();
       ADOQuery5->Close()
Посмотри внимательно на этот кусок кода
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
29.11.2014, 10:59  [ТС]
Цитата Сообщение от Sasha Посмотреть сообщение
Посмотри внимательно на этот кусок кода
Это строка работает в другой кнопке.
Саш что не так?
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
29.11.2014, 11:18
Цитата Сообщение от Samrisbe Посмотреть сообщение
Саш что не так?
Зачем закоментировал // ADOQuery5->ExecSQL(); Ведь тут как раз и надо єто писать потому что верхняя строка идёт с INSERT INTO

Добавлено через 1 минуту
Прочти вот здесь Работа с методами Open и ExecSQL
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
29.11.2014, 23:29  [ТС]
Проблема вот в чем:
В это строку должен записаться код абонента, а пишется пустота
C++
1
Abn.Fio=ADOQuery5->Fields->Fields[0]->AsString;
Посмотрю где я прозевал....

Добавлено через 38 минут
Досадная ошибка....была
Я чтоб адреса сравнивать очистил их от номеров подъездов, и поэтому код абонента не выдергивался
Ща переделаю обработку списка чтоб он остался в чистом виде на момент запроса, и будет мне счастье)))
Всем большое спасибо!
cyberforum форевер!
у меня еще один вопрос назревает, но это будет другая тема.

Добавлено через 2 часа 7 минут
Не разумлю как решить этот трабл...
В таблице записано так:
Весенняя 1-4 п.3 //адрес
Весенняя 1-4 п.4
Весенняя 1-4 п.5


В файле реестр.тхт так:
150
ГАГЛОЕВА
Весенняя 1-3 //адрес
6 //номер квартиры
01.03.2014
60 иванова
Весенняя 1-4 п.5
3 //номер квартиры
01.03.2014

Вопрос в том как с таблицы в случае совпадения адреса, начать проверку на совпадение квартиры?

Добавлено через 9 часов 22 минуты
Вот что получилось, может будет кому полезно
завтра погоняю с большим файлом реестр.
если кто увидит в коде касяк, пусть даже через год, пишите.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//для исправления в один формат реестра и адресов в базе
  TStringList *Reestr = new TStringList;
  TStringList *Two = new TStringList;
  TStringList *Pay = new TStringList;
  //для поиска совпавших
  TStringList *Bingo = new TStringList;
  TStringList *Error = new TStringList;
  TStringList *Adresa = new TStringList;
  //читаем с базы
  ADOQuery1->SQL->Text="SELECT Адрес FROM Адреса ORDER BY Адрес";
  ADOQuery1->Active=true;
  ADOQuery1->First();
  //записываем адреса в стринг
  for(int i=0;i<ADOQuery1->RecordCount;i++)
    {
    Adresa->Add(ADOQuery1->Fields->Fields[0]->AsString);
    ADOQuery1->Next();
    }
  //для перевода адреса из базы и адреса из реестра в верхний регистр и сверки на совпадение
  AnsiString df;
  AnsiString ds;
 
  //============начали разноску
  //создаем структуру для форматирования адреса с базы и сверки на совпадение
  struct _sAbresa {String Ulica;} Adr;
  //создаем структуру для чтения реестра
  struct _sAbonent {String Summ, Fio, Address, Kv, Dt, Ops;} Abn;
  Pay->LoadFromFile(ExtractFilePath(Application->ExeName)+"reestr\\Реестр.txt");
  //старт...
  for(int i = 0; i < Adresa->Count; i++)
     {
     //переправляем в формат адрес без подъезда
     Reestr->Assign(Pay);
     Two->CommaText = Adresa->Strings[i];
     Adr.Ulica = Two->Strings[0] + " " + Two->Strings[1];
     df=(AnsiString(Adr.Ulica)).UpperCase(); //  df адрес без подъезда
     //начинаем перебирать реестр
     for(int j = 0; j < Reestr->Count; j++)
        {
        Two->CommaText = Reestr->Strings[j];
        Abn.Summ = Two->Strings[0];
        Abn.Fio = Two->Strings[1];
        Abn.Address = Two->Strings[2] + " " + Two->Strings[3];
        Abn.Kv = Two->Strings[4];
        Abn.Dt = Two->Strings[6];
        Abn.Ops = Two->Strings[7];
        ds=(AnsiString(Abn.Address)).UpperCase(); //  ds адрес из реестра
 
        //если df-адрес из базы, равен ds-адресу из реестра
        if(df == ds)
          {
          // делаем запрос в базу по адресу в формате списка адресов и проверяем дату отключения
          ADOQuery5->SQL->Text="SELECT КодАбон From Абоненты WHERE Квартира="+Abn.Kv+" AND АдрКод=(Select АдрКод From Адреса Where Адрес='"+Adresa->Strings[i]+"') AND IsNull(ДатаОтключения)";
          ADOQuery5->Open();
 
          // передаю в переменную ID запрошенной квартиры
          Abn.Fio=ADOQuery5->Fields->Fields[0]->AsString;
          // делаю проверку если такая квартира в адресе есть, и графа дата отключения пустая
          if(Abn.Fio>0)
            {
            ShowMessage ("Зачисляем " + Abn.Summ + " рублей абоненту " + Adresa->Strings[i] + " кв " + Abn.Kv);
            ADOQuery5->SQL->Text="UPDATE Абоненты SET ПоследнийПлатеж=Date(),НаСчету=НаСчету+"+Abn.Summ+" WHERE Квартира="+Abn.Kv+" AND АдрКод=(Select АдрКод From Адреса Where Адрес='"+Adresa->Strings[i]+"')";
            ADOQuery5->ExecSQL();
            ADOQuery5->SQL->Text="INSERT INTO История(КодАбон,Сумма,Дата,Операция,Время) values("+Abn.Fio+","+Abn.Summ+",'"+ StrToDate(Abn.Dt) +"','Внесение',Time())";
            ADOQuery5->ExecSQL();
            ADOQuery5->Close();
            ShowMessage ("Зачислено успешно !");
            //заносим в стринг успешно зачисленные
            Bingo->Add(Abn.Summ +  "    " + Abn.Fio + "    " + Abn.Address + "    " + Abn.Kv + "     " + Abn.Dt + "     " + Abn.Ops);
            }
          }
        }
     }//стоп...
     
  //==============закончили разноску
  Bingo->SaveToFile(ExtractFilePath(Application->ExeName)+"reestr\\Совпавшие.txt");
  //удаляем стринги
  delete Reestr;
  delete Two;
  delete Pay;
  delete Bingo;
  delete Error;
  delete Adresa;
  //поздравляем с успешным выполнением задачи
  ShowMessage("Реестр разнесен !");
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
01.12.2014, 09:18
Двадцать пятая строка:
Цитата Сообщение от Samrisbe Посмотреть сообщение
struct _sAbresa
И раз проект боевой, то лучша в счетчиках использовать не int, а size_t.

Добавлено через 35 минут
И каков кстати смысл вот этого:
Цитата Сообщение от Samrisbe Посмотреть сообщение
C++
1
struct _sAbresa {String Ulica;} Adr;
? Если тут даже не инкапсуляция.
Городить цельную структуру и использовать ее мало того как темповую переменную, так еще и дублирующую существующую - df.
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
01.12.2014, 13:07  [ТС]
Чет туплю
Цитата Сообщение от SatanaXIII Посмотреть сообщение
И каков кстати смысл вот этого:
C++
1
struct _sAbresa {String Ulica;} Adr;
чтоб было точное совпадение адреса из списка и из базы, то есть я убираю с названия подъезд, и делаю запрос на наличие квартиры, если есть то ок...
я переделываю код, хочу местами сперва цикл перебирающий строки реестра, потом строки списка подъездов.
Ато получается сейчас не все строки разносит, в частности если один и тот-же адрес в реестре есть то он остается не разнесенным.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
01.12.2014, 13:27
Да тут даже не вдаваясь в смысл:
C++
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
AnsiString df; // 1) Объявили df
  AnsiString ds;
 
  struct _sAbresa {String Ulica;} Adr; // 2) Объявили целую структуру ради одной строковой переменной
  struct _sAbonent {String Summ, Fio, Address, Kv, Dt, Ops;} Abn;
  Pay->LoadFromFile(ExtractFilePath(Application->ExeName)+"reestr\\Реестр.txt");
  for(int i = 0; i < Adresa->Count; i++)
     {
     Reestr->Assign(Pay);
     Two->CommaText = Adresa->Strings[i];
     Adr.Ulica = Two->Strings[0] + " " + Two->Strings[1]; // 3) Положили в структуру строку
     df=(AnsiString(Adr.Ulica)).UpperCase(); // 4) Положили в df структуру
     for(int j = 0; j < Reestr->Count; j++)
        {
        /*...*/
        if(df == ds) 5) // Структура более не нужна
          {
Может ее убрать вообще?
C++
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
AnsiString df; // 1) Объявили df
  AnsiString ds;
 
  //struct _sAbresa {String Ulica;} Adr; // 2) Объявили целую структуру ради одной строковой переменной
  struct _sAbonent {String Summ, Fio, Address, Kv, Dt, Ops;} Abn;
  Pay->LoadFromFile(ExtractFilePath(Application->ExeName)+"reestr\\Реестр.txt");
  for(int i = 0; i < Adresa->Count; i++)
     {
     Reestr->Assign(Pay);
     Two->CommaText = Adresa->Strings[i];
     //Adr.Ulica = Two->Strings[0] + " " + Two->Strings[1]; // 3) Положили в структуру строку
     df = String( Two->Strings[0] + " " + Two->Strings[1] ).UpperCase(); // (AnsiString(Adr.Ulica)).UpperCase(); // 4) Положили в df структуру
     for(int j = 0; j < Reestr->Count; j++)
        {
        /*...*/
        if(df == ds) 5) // Структура более не нужна
          {
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.12.2014, 13:27

Считывание и запись в COM порт
Есть код на стороне Ардуины, он работает, с ним всё порядке: boolean dataReady = 0; char incomingChar; char typeMessage; String...

Считывание данных с базы и запись в Label
Подскажите такой вопрос: куда написать вот этот код(его мне тоже тут подсказали): int i = 1; Form3-&gt;ADOTable1-&gt;First(); ...

Считывание ячеек из StringGrid и запись их в динамический массив C++
Доброго времени суток! Совсем недавно начал осваивать Builder C++ и сам синтаксис языка плюсов (до этого изучал Си). Мне необходимо...

Запись txt файла в AnsiString
Подскажите как можно записать txt файл в AnsiString.

Запись в StringGrid из .txt файла
Привет. Подскажите как решить сложившуюся проблему. Решение проблемы понятно, но с реализацией... В текстовом файле записана структура. В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru