|
![]() |
#1 |
Moderator
|
В Excel нет отдельного типа "Время" (не путать с форматом, отображающим только время, без даты). Есть единый тип "Дата", в котором собственно дата является целым числом (до запятой), а время дробным (после запятой). Особенно хорошо это видно при программировании на VBA: есть тип Date, но нет Time.
Чтобы загрузить время в Аксапту следует до импорта из Excel в самом Excel: - либо превратить время в вещественный тип путем назначения столбцу формата General (Общий); - либо превратить его в вещественный тип, умножить на 86400 и тащить в Аксапту в виде общего количества секунд; - либо распарсить исходное время на часы, минуты и секунды, импортировать эти 3 значения по отдельности и уже в Аксапте собирать, - либо превратить в текст вида "09:30:00" при помощи функции вроде =ТЕКСТ(A1,"[ЧЧ]:ММ:СС"). |
|
|
За это сообщение автора поблагодарили: IvanOFF (1). |
![]() |
#2 |
MCTS
|
Цитата:
Сообщение от Gustav
![]() В Excel нет отдельного типа "Время" (не путать с форматом, отображающим только время, без даты). Есть единый тип "Дата", в котором собственно дата является целым числом (до запятой), а время дробным (после запятой). Особенно хорошо это видно при программировании на VBA: есть тип Date, но нет Time.
Чтобы загрузить время в Аксапту следует до импорта из Excel в самом Excel: - либо превратить время в вещественный тип путем назначения столбцу формата General (Общий); - либо превратить его в вещественный тип, умножить на 86400 и тащить в Аксапту в виде общего количества секунд; - либо распарсить исходное время на часы, минуты и секунды, импортировать эти 3 значения по отдельности и уже в Аксапте собирать, - либо превратить в текст вида "09:30:00" при помощи функции вроде =ТЕКСТ(A1,"[ЧЧ]:ММ:СС"). |
|
![]() |
#3 |
Участник
|
Возникла проблема с экспортом через ADO в Excel полей с типом дата. Если переносить как adbSTR, то это не устраивает конечных пользователей (не работает нормльно фильтрация). Если переносить как adDBDate, то datenull() отображается в Excel как 02.01.1900. Применение формата "ДД.ММ.ГГГГ" к ячейке не помогает. Можно ли как-нибудь передать дату так, чтобы пустая дата не отображалась?
|
|
![]() |
#4 |
Участник
|
Сам нашел выход. Если значение поля в Axapte datenull(), то нужно писать в ADO field.value() не значение поля, а просто 0. А в Excel у активного листа выставить в false параметр DisplayZeros(0).
|
|
![]() |
#5 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: Gustav (2). |
![]() |
#6 |
Участник
|
Тот же результат, что и с 0.
|
|
![]() |
#7 |
Moderator
|
Да, именно так и надо делать. Лично я - сторонник этого способа
![]() У меня так происходит, если тип поля рекордсета задавать константой adDate(7). А если взять adDBDate, которая 133, то на месте нулевых дат в Excel будут желаемые пустые ячейки. Во всяком случае для сочетания Ax 3.0 SP4 + Oracle 10 + Excel 2003 это так. |
|
![]() |
#8 |
Moderator
|
Пользуясь сегодняшнем случаем наконец-то подправил в своем рабочем классе (практически в персональном "пролетариате"
![]() X++: #CCADO void setValue(anytype _fldName, anytype _fldValue) { // _fldName - можно текстовое имя, а можно числовое, начиная с 1 (!), а не 0 как в самом ADO anytype fldName; ; if (typeof(_fldName)==Types::Integer) fldName = _fldName - 1; else fldName = _fldName; fld = flds.Item(fldName); // COM flds и fld - полЯ и полЕ рекордсета, определены в Class Declaration if (! ((fld.Type()==#adDate || fld.Type()==#adDBDate) && !_fldValue) ) { fld.Value(_fldValue); // если непустая дата или любое др.значение } // иначе если значение - пустая дата, то вообще не прописываем в поле } X++: if (ltDb.TransDate)
out2xls.setValue(nextNum(),ltDb.TransDate); |
|
![]() |
#9 |
Участник
|
Как передать в Excel (через ADO) число типа real так, чтобы оно не преобразовывалось в дату? Я указывают тип поля adDouble, а Excel всё равно преобразует в дату.
|
|
![]() |
#10 |
Участник
|
Цитата:
X++: static void Job20100506(Args _args) { #define.adDouble(5) COM Recordset; COM Fields; COM Field; COM Application; COM Workbooks; COM Workbook; COM Worksheets; COM Worksheet; COM Range; ; Recordset = new COM('ADODB.Recordset'); Fields = Recordset.Fields(); Fields.Append('Field1', #adDouble); Recordset.Open(); Recordset.AddNew(); Field = Fields.Item('Field1'); Field.Value(123.45); Recordset.Update(); Application = new COM('Excel.Application'); Workbooks = Application.Workbooks(); Workbook = Workbooks.add(); Worksheets = Workbook.Worksheets(); Worksheet = Worksheets.Item(1); Range = Worksheet.Range('A1'); Range.CopyFromRecordset(Recordset); Recordset.Close(); Application.Visible(true); } |
|
![]() |
#11 |
Moderator
|
Тоже не воспроизвелось
![]() X++: static void Job298(Args _args) { #CCADO COM rng = SysExcelApplication::construct().workbooks().add().worksheets().itemFromNum(1).range('A1').comObject(); COM rst = new COM('ADODB.Recordset'); COM flds = rst.Fields(); COM fld; int i; flds.Append('MyReal', #adDouble); rst.Open(); fld = flds.Item('MyReal'); for (i=1; i<=10; i++) { rst.AddNew(); fld.Value(100 + i/10); rst.Update(); } rng.CopyFromRecordset(rst); COM::createFromObject(rng.Application()).Visible(true); // отобразим Excel } |
|
![]() |
#12 |
Участник
|
Цитата:
А меня в шаблоне в ячейке указан формат "Число". И если передавать как строку - всё работает. Но уже второй день бьюсь над этим. Пришлось передавать поля типа "Строка" |
|
![]() |
#13 |
Moderator
|
Я обычно adDouble не использую, а использую для adCurrency.
Конечно, на файл шаблона бы взглянуть... Хотя бы на тот его фрагмент, куда пишется adDouble. Можно выложить? |
|
![]() |
#14 |
Участник
|
Выложил результат работы и шаблон
Последний раз редактировалось Roman N. Krivov; 06.05.2010 в 13:05. |
|
Теги |
ado, comvariant, excel, faq, odbc, sql, интеграция, прямой доступ, формат дат, экспорт, экспорт в excel |
|
|