Всем здравствуйте! Прошу помощи, ибо замучилась с этим си.
Суть: приведеная ниже функция проходит свое тело до конца, однако на выходе выдает Access violation ... in module Proeсt.exe, потом при попытке завершить программу пишет abnormal program termination. Кое как отловила ошибку, до этого catch не мог ее отследить прога просто висла и все.
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. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220.
int TFKalend::zapisGrafik(int KodRasch, AnsiString Tip, AnsiString VidRasch, TDateTime NachDate, TDateTime KonDate, int KodSootv=0)
{
TDateTime d1,d2,d3,d4;
AnsiString Mas[3];
int kolCikl=2;
if ((VidRasch=="kolCokol")||(VidRasch=="kolEtazh1")||(VidRasch=="KolOstalEtazh"))
{
AnsiString b;
if (VidRasch=="kolCokol") b="301";
else if (VidRasch=="kolEtazh1") b="302";
else b="303";
FMain->ZaprosOpen(ADOQ,"Select t1.Znachenie[t1],t2.Znachenie[t2] from ZnachNastr t1,ZnachNastr t2 where t1.kodRasch=t2.kodRasch and (t2.kodNastr-t1.kodNastr=100) and t1.kodNastr="+b+" and t1.kodRasch="+IntToStr(KodRascheta));
if (StrToDate(ADOQ->FieldValues["t1"])>NachDate)
{
if (StrToDate(ADOQ->FieldValues["t1"])>KonDate)
{
d3=StrToDate(ADOQ->FieldValues["t1"]);
d4=StrToDate(ADOQ->FieldValues["t2"]);
d1=NachDate;
d2=KonDate;
Mas[1]="2";
Mas[2]="1";
}
else
{
d1=NachDate;
d2=StrToDate(ADOQ->FieldValues["t1"]);
kolCikl=3;
if (StrToDate(ADOQ->FieldValues["t2"])>KonDate)
{
d3=KonDate;
d4=StrToDate(ADOQ->FieldValues["t2"]);
Mas[1]="2";
Mas[2]="1 or kodDoma=2";
Mas[3]="1";
}
else
{
d4=KonDate;
d3=StrToDate(ADOQ->FieldValues["t2"]);
Mas[1]="2";
Mas[2]="1 or kodDoma=2";
Mas[3]="2";
}
}
}
else
{
if (StrToDate(ADOQ->FieldValues["t2"])<NachDate)
{
d1=StrToDate(ADOQ->FieldValues["t1"]);
d2=StrToDate(ADOQ->FieldValues["t2"]);
d3=NachDate;
d4=KonDate;
Mas[1]="1";
Mas[2]="2";
}
else
{
d2=NachDate;
d1=StrToDate(ADOQ->FieldValues["t1"]);
kolCikl=3;
if (StrToDate(ADOQ->FieldValues["t2"])>KonDate)
{
d3=KonDate;
d4=StrToDate(ADOQ->FieldValues["t2"]);
Mas[1]="1";
Mas[2]="1 or kodDoma=2";
Mas[3]="1";
}
else
{
d4=KonDate;
d3=StrToDate(ADOQ->FieldValues["t2"]);
Mas[1]="1";
Mas[2]="1 or kodDoma=2";
Mas[3]="2";
}
}
}
}
//Выбираем список отсеков
AnsiString Paste="";
AnsiString Text="";
if (Tip=="СВ") Text+="Select KodOtseka,dlina,obrez,shponka,lastHvost";
if (Tip=="ПП") Text+="Select KodOtseka,dlina,shirina,sh1,ank1,virez1,sh2,ank2,virez2,sh3,ank3,virez3,sh4,ank4,virez4";
FMain->ZaprosOpen(QOts,Text+" from otseki where kodTipPanel='"+Tip+"'");
//обновляем таблицу панелей
Text="update paneli set raspred=((select "+VidRasch+" from raschPanel where paneli.kodPanel=raschPanel.kodPanel and kodRasch="+IntToStr(KodRasch)+")-(select count(*) from grafik g where kodRasch="+IntToStr(KodRasch)+" and g.kodPanel=paneli.kodPanel and charindex('"+VidRasch+"',komment)>0)) where isnull("+VidRasch+",0)>0 and kodTipPanel='"+Tip+"'";
FMain->ZaprosExec(ADOQ,Text);
//Запускаем цикл по дню
TDateTime day,dateF;
for (int i=1; i<=kolCikl; i++)
{
if (i==1) {NachDate=d1; KonDate=d2;}
if (i==2) {NachDate=d2; KonDate=d3;}
if (i==3) {NachDate=d3; KonDate=d4;}
day=NachDate;
while (day<KonDate)
{
QOts->First();
do
{
dateF.Val=0;
Text="";
Paste="";
if (VidRasch=="KolOstalEtazh") Paste="*9";
if (Tip=="СВ") Text+="Select kodPanel,dlina,"+VidRasch+Paste;
if (Tip=="ПП") Text+="Select kodPanel,dlina,"+VidRasch+Paste+",shirina";
Text+=" from Paneli where isnull("+VidRasch+",0)>0 and kodTipPanel='"+Tip+"' and dlina<="+QOts->FieldValues["dlina"];
if (Tip=="СВ")
{
if (KodSootv==0) Text+=" and obrez="+QOts->FieldValues["obrez"]+" and shponka="+QOts->FieldValues["shponka"]+" and lastHvost="+QOts->FieldValues["lastHvost"]+" and raspred>0 and ostalos>0 and kodPanel in (select kodPanel from RaschPanel where kodRasch="+IntToStr(KodRasch)+")";
if (KodSootv==1) Text+=" and obrez="+QOts->FieldValues["obrez"]+" and raspred>0 and ostalos>0 and kodPanel in (select kodPanel from RaschPanel where kodRasch="+IntToStr(KodRasch)+")";
}
if (Tip=="ПП")
{
Text+=" and shirina<="+QOts->FieldValues["shirina"]+" and sh1="+QOts->FieldValues["sh1"]+" and ank1="+QOts->FieldValues["ank1"]+" and virez1="+QOts->FieldValues["virez1"]+" and sh2="+QOts->FieldValues["sh2"]+" and ank2="+QOts->FieldValues["ank2"];
Text+=" and virez2="+QOts->FieldValues["virez2"]+" and sh3="+QOts->FieldValues["sh3"]+" and ank3="+QOts->FieldValues["ank3"]+" and virez3="+QOts->FieldValues["virez3"]+" and raspred>0 and sh4="+QOts->FieldValues["sh4"]+" and ank4="+QOts->FieldValues["ank4"]+" and virez4="+QOts->FieldValues["virez4"]+" and kodPanel in (select kodPanel from RaschPanel where kodRasch="+IntToStr(KodRasch)+")";
}
if (VidRasch=="KolOstalEtazh")
{
Paste="*15";
if (Tip=="СВ") Text+="union Select kodPanel,dlina,"+VidRasch+Paste;
if (Tip=="ПП") Text+="Select kodPanel,dlina,"+VidRasch+Paste+",shirina";
Text+=" from Paneli where isnull("+VidRasch+",0)>0 and raspred>0 and ostalos>0 and kodTipPanel='"+Tip+"' and dlina<="+QOts->FieldValues["dlina"];
if (Tip=="СВ")
{
if (KodSootv==0) Text+=" and obrez="+QOts->FieldValues["obrez"]+" and shponka="+QOts->FieldValues["shponka"]+" and lastHvost="+QOts->FieldValues["lastHvost"]+" and kodPanel in (select kodPanel from RaschPanel where kodRasch="+IntToStr(KodRasch)+")";
if (KodSootv==1) Text+=" and obrez="+QOts->FieldValues["obrez"]+" and kodPanel in (select kodPanel from RaschPanel where kodRasch="+IntToStr(KodRasch)+")";
}
if (Tip=="ПП") Text+=" and shirina<="+QOts->FieldValues["shponka"]+" and sh1="+QOts->FieldValues["sh1"]+" and ank1="+QOts->FieldValues["ank1"]+" and virez1="+QOts->FieldValues["virez1"]+" and sh2="+QOts->FieldValues["sh2"]+" and ank2="+QOts->FieldValues["ank2"]+" and virez2="+QOts->FieldValues["virez2"]+" and sh3="+QOts->FieldValues["sh3"]+" and ank3="+QOts->FieldValues["ank3"]+" and virez3="+QOts->FieldValues["virez3"]+" and sh4="+QOts->FieldValues["sh4"]+" and ank4="+QOts->FieldValues["ank4"]+" and virez4="+QOts->FieldValues["virez4"]+" and kodPanel in (select kodPanel from RaschPanel where kodRasch="+IntToStr(KodRasch)+")";
}
Text+=" and koddoma="+Mas[i]+" order by 3 desc";
FMain->ZaprosOpen(QPan,Text);
QPan->First();
int per=0;
FMain->ZaprosOpen(ADOQ,"Select top 1 p.kodPanel,dataNachForm,dataKonForm,sum(p.dlina)[SumDlina],count(doublePanel)[countPan],komment from grafik g join paneli p on p.kodPanel=g.KodPanel Where g.kodRasch="+IntToStr(KodRasch)+" and kodOtseka="+QOts->FieldValues["KodOtseka"]+" Group by p.kodPanel,dataNachForm,dataKonForm,komment order by 2 desc");
if (ADOQ->RecordCount==0)
{
dateF=NachDate;
}
else
{
if (ADOQ->FieldValues["KodPanel"]!=QPan->FieldValues["KodPanel"])
{
dateF=TDateTime(ADOQ->FieldValues["dataKonForm"])+1.0/24; per=1;
}
else
{
dateF=TDateTime(ADOQ->FieldValues["dataKonForm"]);
}
}
if (dateF<=(day+1.0))
{
bool raspr=true;
if (QPan->RecordCount>0)
{
while (dateF<=(day+1.0) && raspr)
{
FMain->ZaprosOpen(ADOQ,"select raspred from paneli where kodPanel="+QPan->FieldValues["KodPanel"]);
int kolPan=ADOQ->FieldValues["raspred"];
if (kolPan<1)
{
QPan->Next();
FMain->ZaprosOpen(ADOQ,"select raspred from paneli where kodPanel="+QPan->FieldValues["KodPanel"]);
kolPan=ADOQ->FieldValues["raspred"];
}
if (kolPan<=0) break;
FMain->ZaprosOpen(QDom,"select kodDoma,nameDoma from Grafik g join NameDom n on g.KodRasch=n.KodRasch where koddoma=(select kodDoma from Paneli p where p.KodPanel="+QPan->FieldValues["KodPanel"]+") and g.kodRasch="+IntToStr(KodRasch)+" Order by dataNachForm");
int Posl=0;
if (!QDom->FieldValues["kodDoma"].IsNull())
Posl=(int)QDom->FieldValues["kodDoma"];
FMain->ZaprosOpen(QDom,"select kodDoma,NameDoma From NameDom where kodDoma=(select kodDoma from Paneli where KodPanel="+QPan->FieldValues["KodPanel"]+") and kodRasch="+IntToStr(KodRasch)+" order by 1");
QDom->First();
while (Posl>0 && (int)QDom->FieldValues["kodDoma"]!=Posl)
{
QDom->Next();
}
if (!QDom->FindNext()) QDom->First();
try
{
FMain->ZaprosExec(QVstav,"insert into Grafik (kodRasch,kodOtseka,dataNachForm,dataKonForm,kodPanel,kodSootv,perenal,doublePanel,komment,otprav) values ("+IntToStr(KodRasch)+","+QOts->FieldValues["KodOtseka"]+",'"+dateF.FormatString("mm.dd.yyyy hh:nn")+"','"+(dateF+11.0/24).FormatString("mm.dd.yyyy hh:nn")+"',"+QPan->FieldValues["kodPanel"]+","+IntToStr(KodSootv)+","+per+",0,'"+VidRasch+","+QDom->FieldValues["NameDoma"]+"',0) update paneli set raspred=raspred-1,ostalos=ostalos-1 where kodPanel="+QPan->FieldValues["KodPanel"]);
kolPan-=1;
if (!QDom->FindNext()) QDom->First();
if (kolPan>0 && (int)QPan->FieldValues["dlina"]*2<=(int)QOts->FieldValues["dlina"])
{
FMain->ZaprosExec(QVstav,"insert into Grafik (kodRasch,kodOtseka,dataNachForm,dataKonForm,kodPanel,kodSootv,perenal,doublePanel,komment,otprav) values ("+IntToStr(KodRasch)+","+QOts->FieldValues["KodOtseka"]+",'"+dateF.FormatString("mm.dd.yyyy hh:nn")+"','"+(dateF+11.0/24).FormatString("mm.dd.yyyy hh:nn")+"',"+QPan->FieldValues["kodPanel"]+","+IntToStr(KodSootv)+","+per+",1,'"+VidRasch+","+QDom->FieldValues["NameDoma"]+"',0) update paneli set raspred=raspred-1,ostalos=ostalos-1 where kodPanel="+QPan->FieldValues["KodPanel"]);
kolPan-=1;
}
dateF+=11.0/24;
raspr=true;
}
catch (...)
{raspr=false;}
}
}
}
} while (QOts->FindNext());
day+=1.0;
}
}
QOts->Close();
QPan->Close();
ADOQ->Close();
QDom->Close();
return 0;
}
Вызывается эта функция при создании формы:
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.
FMain->ZaprosExec(QRasch,"update paneli set ostalos=kolNaDom*(Select cast(Znachenie as int) from ZnachNastr where kodRasch="+IntToStr(KodRascheta)+" and kodNastr=1) where kodDoma=1");
FMain->ZaprosExec(QRasch,"update paneli set ostalos=kolNaDom*(Select cast(Znachenie as int) from ZnachNastr where kodRasch="+IntToStr(KodRascheta)+" and kodNastr=2) where kodDoma=2");
FMain->ZaprosOpen(QRasch,"select t1.kodNastr,t1.Znachenie[t1],t2.Znachenie[t2] from ZnachNastr t1,ZnachNastr t2 where t1.kodRasch=t2.kodRasch and (t2.kodNastr-t1.kodNastr=100) and t1.kodNastr>303 and t1.kodNastr<400 and t1.kodRasch="+IntToStr(KodRascheta)+" order by 1");
QRasch->First();
try
{
int c=zapisGrafik(KodRascheta,"СВ","kolCokol",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);
zapisGrafik(KodRascheta,"СВ","kolCokol",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],1);
}
catch(Exception *E)
{
ShowMessage("Ошибочка2!"+E->ClassName()+" "+E->Message);
}
QRasch->Next();
zapisGrafik(KodRascheta,"СВ","kolEtazh1",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);
zapisGrafik(KodRascheta,"СВ","kolEtazh1",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],1);
QRasch->Next();
zapisGrafik(KodRascheta,"СВ","KolOstalEtazh",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);
zapisGrafik(KodRascheta,"СВ","KolOstalEtazh",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],1);
QRasch->Next();
zapisGrafik(KodRascheta,"СВ","kolEtazh17",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);
zapisGrafik(KodRascheta,"СВ","kolEtazh17",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],1);
QRasch->Next();
zapisGrafik(KodRascheta,"СВ","kolEtazh18",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);
zapisGrafik(KodRascheta,"СВ","kolEtazh18",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],1);
QRasch->First();
zapisGrafik(KodRascheta,"ПП","kolCokol",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);
QRasch->Next();
zapisGrafik(KodRascheta,"ПП","kolEtazh1",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);
QRasch->Next();
zapisGrafik(KodRascheta,"ПП","kolOstalEtazh",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);
QRasch->Next();
zapisGrafik(KodRascheta,"ПП","kolEtazh17",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);
QRasch->Next();
zapisGrafik(KodRascheta,"ПП","kolEtazh18",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);
}
причем указанный здесь catch не отрабатывается. ошибку отлавливает компонент ApplicationEvents.
на всякий случай код вызываемых внутри пользовательских функций
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.
int TFMain::ZaprosOpen(TADOQuery *Q,AnsiString Text)
{
try
{
Q->SQL->Clear();
Q->SQL->Add(Text);
Q->Open();
}
catch (Exception *ex)
{
Application->MessageBoxA(ex->Message.c_str(),"Ошибка!",0);
return 1;
}
return 0;
}
int TFMain::ZaprosExec(TADOQuery *Q,AnsiString Text)
{
try
{
Q->SQL->Clear();
Q->SQL->Add(Text);
Q->ExecSQL();
}
catch (Exception *ex)
{
Application->MessageBoxA(ex->Message.c_str(),"Ошибка!",0);
return 1;
}
return 0;
}
Помогие, плиз, непутевой!
ПС. Знаю, код не оптимизирован, все руки не доходят этим заняться
|