AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Функционал
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.09.2013, 12:18   #1  
smoyk is offline
smoyk
Участник
 
188 / 13 (1) ++
Регистрация: 20.04.2007
Сабж?
При простом
book.Worksheets.Add
добавляет лист в начало списка, если же написать
book.Worksheets.Add('', book.Worksheets.Item(book.Sheets.Count), 1, -4167)
то ошибка
---------------------------
Microsoft Dynamics NAV Classic
---------------------------
Сообщение для программистов C/AL:

Не удалось вызвать член Add. Microsoft Excel возвратил следующее сообщение:
Метод Add из класса Sheets завершен неверно
Старый 16.09.2013, 19:49   #2  
Fly is offline
Fly
Участник
Аватар для Fly
 
102 / 10 (1) +
Регистрация: 05.10.2007
Сам не пробовал, нашел вот такое решение:
http://stackoverflow.com/questions/1...od-not-working
Старый 16.09.2013, 20:32   #3  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
Вместо кавычек в первом параметре нужно как-то передать NULL.
Старый 17.09.2013, 06:35   #4  
smoyk is offline
smoyk
Участник
 
188 / 13 (1) ++
Регистрация: 20.04.2007
Присвоение значения параметров при вызове типа Add(After:=) по моеу чисто вбашная фишка. Врать не буду, но помоему даже в дельфи не работает, в навике точно, пробовал.
InTacto, да-да, кэп?) Какие будут предложения?)
Ну я пробовал создать переменную типа вэриант и ей сделать clear. Больше нет вариантов((
Старый 17.09.2013, 08:45   #5  
Cheb is offline
Cheb
Участник
Лучший по профессии 2017
 
138 / 13 (1) ++
Регистрация: 22.09.2002
Адрес: Ростов-на-Дону -> Москва
В качестве обходного решения можно перемещать лист в конец списка командой Move после вставки листа в начало.
Старый 17.09.2013, 11:32   #6  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
Цитата:
Сообщение от smoyk Посмотреть сообщение
Присвоение значения параметров при вызове типа Add(After:=) по моеу чисто вбашная фишка. Врать не буду, но помоему даже в дельфи не работает, в навике точно, пробовал.
InTacto, да-да, кэп?) Какие будут предложения?)
Ну я пробовал создать переменную типа вэриант и ей сделать clear. Больше нет вариантов((
Если я кэп, какого ... в первом сообщении стоят кавычки, а не что-то другое? Или кавычки теперь NULL и я пропустил эту новость? ссылочку в студию
Дело не в явном указании названия параметра, а в пропуске самого параметра. Это позволяет сделать многие объктные языки (vb6, vb.net, c#)
В навике (по крайней мере до 5 версии) пропуск параметров, к сожалению, табу.

В работе с ADO можно получить NULL или написать библиотечку, которая вызывает эту ф-цию.
Старый 17.09.2013, 12:56   #7  
smoyk is offline
smoyk
Участник
 
188 / 13 (1) ++
Регистрация: 20.04.2007
chebv,

Вы не поверите) Та же самая ошибка и с мувом, видимо по той же причине, т.к. там два параметра, before и after.

InTacto,

Ну что то же надо было поставить) Понятно, что как бэ лучше null, но нула в навике нет, поэтому и стоят кавычки) Хотя бы компилятор схавал. А что еще поставить я не знаю, поэтому и спросил про предложения, какие есть....
В работе с адо вы имеете ввиду через селект нул вернуть? Или как?)
Старый 17.09.2013, 13:25   #8  
smoyk is offline
smoyk
Участник
 
188 / 13 (1) ++
Регистрация: 20.04.2007
Кстати, коллеги мне подсказывают, что у нас 6й нав) Можно параметр пропустить при вызове? Как?
Старый 17.09.2013, 13:30   #9  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
Цитата:
Сообщение от smoyk Посмотреть сообщение
chebv,

Вы не поверите) Та же самая ошибка и с мувом, видимо по той же причине, т.к. там два параметра, before и after.

InTacto,

Ну что то же надо было поставить) Понятно, что как бэ лучше null, но нула в навике нет, поэтому и стоят кавычки) Хотя бы компилятор схавал. А что еще поставить я не знаю, поэтому и спросил про предложения, какие есть....
В работе с адо вы имеете ввиду через селект нул вернуть?
Да, получить значени поля, которое может принимать значение NULL, например при инициализации, и пихнуть его в первый параметр. Но это совсем уже по хитровански. />

Еще можно макрос написать прям из навика в книгу и сделать его вызов, но должно быть разрещено выполнение макросов.
Старый 17.09.2013, 13:41   #10  
smoyk is offline
smoyk
Участник
 
188 / 13 (1) ++
Регистрация: 20.04.2007
Не, ну так то и просто "select null" работает, но это какойто индусский код(
А что с пропуском параметров?
Старый 17.09.2013, 17:24   #11  
Cheb is offline
Cheb
Участник
Лучший по профессии 2017
 
138 / 13 (1) ++
Регистрация: 22.09.2002
Адрес: Ростов-на-Дону -> Москва
Извращение конечно, но можно так: сначала NewSheet.Move(SheetEnd), т.е. новый лист становится предпоследним, а затем SheetEnd.Move(NewSheet)
Старый 18.09.2013, 06:10   #12  
smoyk is offline
smoyk
Участник
 
188 / 13 (1) ++
Регистрация: 20.04.2007
Цитата:
Сообщение от chebv Посмотреть сообщение
Извращение конечно, но можно так: сначала NewSheet.Move(SheetEnd), т.е. новый лист становится предпоследним, а затем SheetEnd.Move(NewSheet) />
Да, но так работает) Всем спасибо за помощ и советы.
Старый 18.09.2013, 17:30   #13  
srg is offline
srg
Участник
 
116 / 10 (1) +
Регистрация: 20.08.2013
расскажите как правильно юзать функцию _БордерАроунд
Старый 18.09.2013, 17:43   #14  
srg is offline
srg
Участник
 
116 / 10 (1) +
Регистрация: 20.08.2013
вообще нужно вот такую вот вызгрузку в ексель сделать.
как поля вписать я понимаю, а вот как сделать обрамление и перенос хз..
Старый 18.09.2013, 18:04   #15  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
Задать границы
Код:
SetBorder(xlRowIDPar : Integer;xlColIDPar : Integer;Border : Integer)
// Стандартные индексы границ ячейки Excel
// 1. xlEdgeLeft         = 7  (левая)
// 2. xlEdgeRight        = 10 (правая)
// 3. xlEdgeTop          = 8  (верхняя)
// 4. xlEdgeBottom       = 9  (нижняя)
// 5. xlDiagonalDown     = 5  (диагональ лево верх - право низ)
// 6. xlDiagonalUp       = 6  (диагональ право верх - лево низ)

// Задается стиль линии: 1 - обычная сплошная
CASE Border OF
1: XlWrkSht.Range(GetxlColID(xlColIDPar) + GetxlRowID(xlRowIDPar)).Borders.Item(7).LineStyle := 1; 
2: XlWrkSht.Range(GetxlColID(xlColIDPar) + GetxlRowID(xlRowIDPar)).Borders.Item(10).LineStyle := 1;
3: XlWrkSht.Range(GetxlColID(xlColIDPar) + GetxlRowID(xlRowIDPar)).Borders.Item(8).LineStyle := 1;
4: XlWrkSht.Range(GetxlColID(xlColIDPar) + GetxlRowID(xlRowIDPar)).Borders.Item(9).LineStyle := 1;
5: XlWrkSht.Range(GetxlColID(xlColIDPar) + GetxlRowID(xlRowIDPar)).Borders.Item(5).LineStyle := 1;
6: XlWrkSht.Range(GetxlColID(xlColIDPar) + GetxlRowID(xlRowIDPar)).Borders.Item(6).LineStyle := 1;
END;
// толщины линий для каждой стороны задаются через св-во Weight
XlWrkSht.Range(GetxlColID(xlColIDPar) + GetxlRowID(xlRowIDPar)).Borders.Item(7).Weight = 3

// обрамляющая, заполняются все 4 стороны
XlWrkSht.Range(GetxlColID(xlColIDPar) + GetxlRowID(xlRowIDPar)).Borders.LineStyle := 1;


GetxlColID(ColumnNo : Integer) : Text[30]
xlColIDLoc := '';
IF ColumnNo <> 0 THEN BEGIN
  x := ColumnNo - 1;
  c := 65 + x MOD 26;
  xlColIDLoc[10] := c;
  i := 10;
  WHILE x > 25 DO BEGIN
    x := x DIV 26;
    i := i - 1;
    c := 64 + x MOD 26;
    xlColIDLoc[i] := c;
  END;
  FOR x := i TO 10 DO
    xlColIDLoc[1+x-i] := xlColIDLoc[x];
END;

EXIT(xlColIDLoc);


GetxlRowID(RowNo : Integer) : Text[30]
xlRowIDLoc := '';
IF RowNo <> 0 THEN
  xlRowIDLoc := FORMAT(RowNo);
EXIT(xlRowIDLoc);
перенос
Код:
XlWrkSht.Range(GetxlColID(xlColIDPar) + GetxlRowID(xlRowIDPar)).WrapText := TRUE;
остальное можно посмотреть, запустив запись макросов.
Старый 18.09.2013, 18:48   #16  
srg is offline
srg
Участник
 
116 / 10 (1) +
Регистрация: 20.08.2013
Цитата:
Сообщение от InTacto Посмотреть сообщение
Задать границы
Код:
SetBorder(xlRowIDPar : Integer;xlColIDPar : Integer;Border : Integer)
// Стандартные индексы границ ячейки Excel
// 1. xlEdgeLeft         = 7  (левая)
// 2. xlEdgeRight        = 10 (правая)
// 3. xlEdgeTop          = 8  (верхняя)
// 4. xlEdgeBottom       = 9  (нижняя)
// 5. xlDiagonalDown     = 5  (диагональ лево верх - право низ)
// 6. xlDiagonalUp       = 6  (диагональ право верх - лево низ)

// Задается стиль линии: 1 - обычная сплошная
CASE Border OF
1: XlWrkSht.Range(GetxlColID(xlColIDPar) + GetxlRowID(xlRowIDPar)).Borders.Item(7).LineStyle := 1; 
2: XlWrkSht.Range(GetxlColID(xlColIDPar) + GetxlRowID(xlRowIDPar)).Borders.Item(10).LineStyle := 1;
3: XlWrkSht.Range(GetxlColID(xlColIDPar) + GetxlRowID(xlRowIDPar)).Borders.Item(8).LineStyle := 1;
4: XlWrkSht.Range(GetxlColID(xlColIDPar) + GetxlRowID(xlRowIDPar)).Borders.Item(9).LineStyle := 1;
5: XlWrkSht.Range(GetxlColID(xlColIDPar) + GetxlRowID(xlRowIDPar)).Borders.Item(5).LineStyle := 1;
6: XlWrkSht.Range(GetxlColID(xlColIDPar) + GetxlRowID(xlRowIDPar)).Borders.Item(6).LineStyle := 1;
END;
// толщины линий для каждой стороны задаются через св-во Weight
XlWrkSht.Range(GetxlColID(xlColIDPar) + GetxlRowID(xlRowIDPar)).Borders.Item(7).Weight = 3

// обрамляющая, заполняются все 4 стороны
XlWrkSht.Range(GetxlColID(xlColIDPar) + GetxlRowID(xlRowIDPar)).Borders.LineStyle := 1;


GetxlColID(ColumnNo : Integer) : Text[30]
xlColIDLoc := '';
IF ColumnNo <> 0 THEN BEGIN
  x := ColumnNo - 1;
  c := 65 + x MOD 26;
  xlColIDLoc[10] := c;
  i := 10;
  WHILE x > 25 DO BEGIN
    x := x DIV 26;
    i := i - 1;
    c := 64 + x MOD 26;
    xlColIDLoc[i] := c;
  END;
  FOR x := i TO 10 DO
    xlColIDLoc[1+x-i] := xlColIDLoc[x];
END;

EXIT(xlColIDLoc);


GetxlRowID(RowNo : Integer) : Text[30]
xlRowIDLoc := '';
IF RowNo <> 0 THEN
  xlRowIDLoc := FORMAT(RowNo);
EXIT(xlRowIDLoc);
перенос
Код:
XlWrkSht.Range(GetxlColID(xlColIDPar) + GetxlRowID(xlRowIDPar)).WrapText := TRUE;
остальное можно посмотреть, запустив запись макросов.
спасибо огромное!
Старый 19.09.2013, 16:39   #17  
srg is offline
srg
Участник
 
116 / 10 (1) +
Регистрация: 20.08.2013
Ребят, как задать цикл, который будет выводить допустим всех сотрудников, для каждого сотрудника свое поле, голова совсем не варит как то
Старый 19.09.2013, 16:56   #18  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
Можно рекордрефы использовать, но заранее нужно прописать где-то, например, в том же сотруднике в каком-нибудь поле, номер поля, значение которого нужно выводить.
Если правильно понял задачу
Старый 19.09.2013, 16:57   #19  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
И вроде как нужно под каждый вопрос новую тему заводить, чтобы потом искать проще было
Старый 20.09.2013, 08:39   #20  
Constantine_imported is offline
Constantine_imported
Участник
 
126 / 10 (1) +
Регистрация: 28.04.2011
Цитата:
Сообщение от Fierce Посмотреть сообщение
Ребят, как задать цикл, который будет выводить допустим всех сотрудников, для каждого сотрудника свое поле, голова совсем не варит как то
Если я правильно понял вопрос, делаете цикл по сотрудникам и переменную Integer, которая будет обозначать номер строки и в цикле ее увеличиваете на 1
Код:
REPEAT
  xlSheet.Range('A' + FORMAT(i)).Value := ...
  xlSheet.Range('B' + FORMAT(i)).Value := ...
  ...
  i += 1;
UNTIL ...
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:42.