Инвариант в строго типизированном классе.
Такие штуки за раз не делаются нормально, нужны итерации.
-----
Это Я вполне себе понимаю.
Только объемы такие, что одному неподъемно... Эти 450К всего лишь часть системы... по сумме - 2Гб соурсов...
Тем более, что нужна постоянно работающая система.
-----
Угу... Я вот переработал другой кусок кода... почти все подтянул... что-то даже работало...
На следующей итерации выяснилось, что можно еще упростить, сделав более правильные базовые классы...
Классы - сделал. А времени переработать код используя эти классы - нету... там - много...
Так и лежит - что-то работающее, что-то доработанное, что-то - вообще не понятное...
Плюс, еще выяснилось, что есть еще кусок кода, который надо синхронно дорабатывать.
А в этом куске - ой, чего там только нет - и работа с базой, и работа с железом, и работа с сетью...
да еще и юзерский интерфейс замороченный...
И все - ВБ6-лике - раздербанить на логические куски - не выходит...
зато до пенсии хватит работы
-----
Это точно плюс. Только вот через пару лет все одно сваливаю. На Юг, к морю...
Таблицы то хоть имеют смысл какой-то или тоже лишь бы как?
------
Га?!!!
Вот только что переработал кусок
[пре]
public DataTable loadDTItemsFurnace2(string startDate, string finishDate, string furnaceID)
{
string[] str;
IEnumerator enumerator = null;
IEnumerator enumerator1 = null;
DataTable DTScanBcd = new DataTable();
DataTable DTBatches = new DataTable();
DataTable DTToughMan = new DataTable();
DataTable DTToughOpt = new DataTable();
DataTable DTTough = null;
try
{
str = new string[] { "SELECT DISTINCT tod.TOD_BATCH_NO batchNo, tod.TOD_OPT_RECIPE recipe, tod.TOD_PIT_NO pitNo FROM C_TOUGH_OPT_DONE tod WHERE tod.TOD_TIMESTAMP BETWEEN TO_DATE('", startDate, "','DD-MON-YY HH24:MI') AND TO_DATE('", finishDate, "','DD-MON-YY HH24:MI') AND tod.TOD_COMPLETE=1 AND tod.TOD_FURNACE_NO IN (", furnaceID, ") " };
DTBatches = (DataTable)DANenprod1.fillDT(string.Concat(str));
try
{
enumerator = DTBatches.Rows.GetEnumerator();
while (enumerator.MoveNext())
{
DataRow DRBatches = (DataRow)enumerator.Current;
str = new string[] { "SELECT 666 bcd, tod.TOD_TIMESTAMP timestamp, SYSDATE presentTime, tmr.TMR_BATCH_NO batchNo, tmr.TMR_SEQUENCE_NO seqNo, ps.PS_ORDER_NO orderNo, ps.PS_ORDER_POS itemNo, akt.AT_CUST_NAM customerName, 1 qty, ap.AP_WIDTH_1/1000*AP_HEIGHT_1/1000 sqm, TOD_OPT_RECIPE recipe FROM AUF_KOPF_TEXTE akt, PRD_SEQ ps, AUF_POS ap, C_TOUGH_OPT_DONE tod, C_TOUGH_MAN_RESULT tmr WHERE tod.TOD_FURNACE_NO=tmr.TMR_FURNACE_NO AND tod.TOD_OPT_RECIPE=tmr.TMR_OPT_RECIPE AND tod.TOD_BATCH_NO=tmr.TMR_BATCH_NO AND tmr.TMR_PIT_NO=tod.TOD_PIT_NO AND tmr.TMR_BATCH_NO=ps.PS_BATCH_NO AND tmr.TMR_SEQUENCE_NO=ps.PS_SEQUENCE_NO AND ps.PS_ORDER_NO=ap.AP_ORDER_NO AND ps.PS_ORDER_POS=ap.AP_ORDER_POS AND akt.AT_ORDER_NO=ps.PS_ORDER_NO AND tod.TOD_COMPLETE=1 AND tod.TOD_BATCH_NO=", DRBatches["batchNo"].ToString(), " AND tod.TOD_OPT_RECIPE=", DRBatches["recipe"].ToString(), " AND tod.TOD_PIT_NO=", DRBatches["pitNo"].ToString(), " AND tod.TOD_FURNACE_NO IN (", furnaceID, ")" };
DTToughMan = (DataTable)DANenprod1.fillDT(string.Concat(str));
if (DTToughMan.Rows.Count == 0)
{
str = new string[] { "SELECT 666 bcd, tod.TOD_TIMESTAMP timestamp, SYSDATE presentTime, tor.TOR_BATCH_NO batchNo, tor.TOR_SEQUENCE_NO seqNo, ps.PS_ORDER_NO orderNo, ps.PS_ORDER_POS itemNo, akt.AT_CUST_NAM customerName, 1 qty, ap.AP_WIDTH_1/1000*AP_HEIGHT_1/1000 sqm, TOD_OPT_RECIPE recipe FROM AUF_KOPF_TEXTE akt, PRD_SEQ ps, AUF_POS ap, C_TOUGH_OPT_DONE tod, C_TOUGH_OPT_RESULT tor WHERE tod.TOD_FURNACE_NO=tor.TOR_FURNACE_NO AND tod.TOD_OPT_RECIPE=tor.TOR_OPT_RECIPE AND tod.TOD_BATCH_NO=tor.TOR_BATCH_NO AND tor.TOR_PIT_NO=tod.TOD_PIT_NO AND tor.TOR_BATCH_NO=ps.PS_BATCH_NO AND tor.TOR_SEQUENCE_NO=ps.PS_SEQUENCE_NO AND ps.PS_ORDER_NO=ap.AP_ORDER_NO AND ps.PS_ORDER_POS=ap.AP_ORDER_POS AND akt.AT_ORDER_NO=ps.PS_ORDER_NO AND tod.TOD_COMPLETE=1 AND tod.TOD_BATCH_NO=", DRBatches["batchNo"].ToString(), " AND tod.TOD_OPT_RECIPE=", DRBatches["recipe"].ToString(), " AND tod.TOD_PIT_NO=", DRBatches["pitNo"].ToString(), " AND tod.TOD_FURNACE_NO IN (", furnaceID, ")" };
DTToughOpt = (DataTable)DANenprod1.fillDT(string.Concat(str));
if (DTToughOpt.Rows.Count > 0)
{
if (DTTough != null)
{
DTTough.Merge(DTToughOpt);
}
else
{
DTTough = DTToughOpt.Copy();
}
}
}
else if (DTTough != null)
{
DTTough.Merge(DTToughMan);
}
else
{
DTTough = DTToughMan.Copy();
}
}
}
finally
{
if (enumerator is IDisposable)
{
(enumerator as IDisposable).Dispose();
}
}
str = new string[] { "SELECT pf.PF_BARCODE bcd, pf.PF_DATE_TIME timestamp, SYSDATE presentTime, ps.PS_BATCH_NO batchNo, ps.PS_SEQUENCE_NO seqNo, ps.PS_ORDER_NO orderNo, ps.PS_ORDER_POS itemNo, akt.AT_CUST_NAM customerName, 1 qty, ap.AP_WIDTH_1/1000*AP_HEIGHT_1/1000 sqm, 0.0 recipe FROM AUF_KOPF_TEXTE akt, PRD_FERTIG pf, PRD_SEQ ps, AUF_POS ap WHERE pf.PF_BATCH_NO=ps.PS_BATCH_NO AND pf.PF_SEQUENCE_NO=ps.PS_SEQUENCE_NO AND ps.PS_ORDER_NO=ap.AP_ORDER_NO AND ps.PS_ORDER_POS=ap.AP_ORDER_POS AND akt.AT_ORDER_NO=ps.PS_ORDER_NO AND pf.PF_DATE_TIME BETWEEN TO_DATE('", startDate, "','DD-MON-YY HH24:MI') AND TO_DATE('", finishDate, "','DD-MON-YY HH24:MI') AND pf.PF_STATION IN (", furnaceID, ") UNION SELECT lb.LB_BCD bcd, lb.LB_TIMESTAMP timestamp, SYSDATE presentTime, ps.PS_BATCH_NO batchNo, ps.PS_SEQUENCE_NO seqNo, ps.PS_ORDER_NO orderNo, ps.PS_ORDER_POS itemNo, akt.AT_CUST_NAM customerName, 1 qty, ap.AP_WIDTH_1/1000*AP_HEIGHT_1/1000 sqm, 0.0 recipe FROM AUF_KOPF_TEXTE akt, C_LOG_BCD lb, PRD_SEQ ps, AUF_POS ap WHERE lb.LB_BATCH_NO=ps.PS_BATCH_NO AND lb.LB_SEQUENCE_NO=ps.PS_SEQUENCE_NO AND ps.PS_ORDER_NO=ap.AP_ORDER_NO AND ps.PS_ORDER_POS=ap.AP_ORDER_POS AND akt.AT_ORDER_NO=ps.PS_ORDER_NO AND lb.LB_TIMESTAMP BETWEEN TO_DATE('", startDate, "','DD-MON-YY HH24:MI') AND TO_DATE('", finishDate, "','DD-MON-YY HH24:MI') AND lb.LB_STATION IN (", furnaceID, ") " };
DTScanBcd = (DataTable)DANenprod1.fillDT(string.Concat(str));
if (DTScanBcd.Rows.Count > 0)
{
if (DTTough != null)
{
try
{
enumerator1 = DTScanBcd.Rows.GetEnumerator();
while (enumerator1.MoveNext())
{
DTTough.ImportRow((DataRow)enumerator1.Current);
}
}
finally
{
if (enumerator1 is IDisposable)
{
(enumerator1 as IDisposable).Dispose();
}
}
}
else
{
DTTough = DTScanBcd.Copy();
}
}
}
catch (Exception exception)
{
ProjectData.SetProjectError(exception);
Exception ex = exception;
string str1 = this._senderAddress;
string settings = MySettingsProperty.Settings.emailErrorRecipient;
str = new string[] { MyProject.Computer.Name.ToString(), ": error in: ", this.GetType().Name, ".", MethodBase.GetCurrentMethod().Name.ToString() };
Email.SendMailMessage(str1, settings, "", "", string.Concat(str), string.Concat("\r\n", ex.ToString()));
ProjectData.ClearProjectError();
}
return (DTTough != null ? DTTough : DTScanBcd);
}
[/пре]
Имеет оно смысл? Или нет?
Вот переработанный кусок:
public void loadDTItemsFurnace2(string pMachineIDs, DateTime pStartDate, DateTime pFinishDate)
{
try
{
TBatches.Table batches = new TBatches.Table();
batches.Load(pMachineIDs, pStartDate, pFinishDate);
TToughMan.Table toughMan = new TToughMan.Table();
TToughOpt.Table toughOpt = new TToughOpt.Table();
foreach (TBatches.Row batch in batches)
{
toughMan.Load(pMachineIDs, batch.BatchNo, batch.Recipe, batch.PitNo);
toughOpt.Load(pMachineIDs, batch.BatchNo, batch.Recipe, batch.PitNo);
this.Append(toughMan);
this.Append(toughOpt);
}
TScanBcd.Table scanBcd = new TScanBcd.Table();
scanBcd.Load(pMachineIDs, pStartDate, pFinishDate);
this.Append(scanBcd);
}
catch (Exception ex)
{
TExceptionHandler.Error(ex);
}
}
Тут вроде смысл просматривается... но это - почти день работы.