Delphi x MSProject

24/11/2009

  Gostaria de saber e alguem tem algum exemplo que mostre a partir do Delphi (utilizo a versão 7) possa criar e enviar as informacoes tarefa, inicio da tarefa, fim, recursos e etc, para um arquivo MSPROJECT da microsoft. Tenho um exemplo que ja manda as tarefas, mas os outros dados nao consigo enviar, tipo: inicio da tarefa, fim e outros.
exemplo:

  DM1.QViewCronogramaItem.First;
  While Not DM1.QViewCronogramaItem.Eof Do
  Begin
    x := MSProject.ActiveProject.Tasks.Add(DM1.QViewCronogramaItemNOMEITEMPROJ.AsString);

    DM1.QViewCronogramaItem.Next;
  End;

Hélio Marques

Respostas

23/04/2012

Er Tassara

Ola Hélio,

Estou tentando exportar dados de um SQL para o MSProject. Ví que você, há algum tempo atras, estava com o mesmo problema que eu. Só consegui exportar o nome da tarefa (os demais dados não são exportados, ocorre um erro). Se conseguiu avançar neste projeto, tem como você me dar umas dicas de como fazer esta exportação?

Grato.

Abs,

Er
Responder Citar

24/04/2012

Hélio Marques

Conseguimos passar mais informações para o MSPROJECT. Segue alguns trechos do nosso código para auxiliar. Agora basta pesquisar na biblioteca MSProject_TLB.pas que tem todos os métodos e propriedades para manipulação. Se evoluir também manda pra gente.

Este considera a identação caso tenha esta regra:
Procedure TFMSProject.PIdentacao(sItem:string; X:integer; bTem:boolean);
var i, iDef : integer;
begin
SPai := DM1.CDSSelecionadosCODIGOPAI.Value;

if (SPai SPaiAnt) and not (bTem) then
begin
iTamIndentAnt := iTamIndent;
iTamIndent := StrToInt(FloatToStr(length(SPai) / 2));
iDef := (iTamIndent - iTamIndentAnt);
try
if iDef > 0 then
for i := 1 to iDef do
MSProject.ActiveProject.Tasks[X].OutlineIndent
else
for i := 1 to (iDef * -1) do
MSProject.ActiveProject.Tasks[X].OutlineOutdent;
except
beep;
inc(iNumeroErro);
ReLog.SelAttributes.Color:= clRed;
RElog.Lines.append( Erro +FMaskNumero(iNumeroErro)+: Atenção! Nível do Item + sItem + está incorreto. Solucione no Cadastro da Planilha.);
end;
end;
SPaiAnt := SPai;
end;

Enviando datas:
procedure TFMSProject.PMsProjectDataRecursos(sItemLimpo : string; X : Integer);
var dDataINI, dDataFIM : TDateTime;
begin
PFechamento(True);
if Trim(DM1.CDSSelecionadosDTINIP.AsString) then
begin
dDataINI := DM1.CDSSelecionadosDTINI.AsDateTime;
if dDataINI 0 then
MSProject.ActiveProject.Tasks[X].Start := dDataINI;
end;
if Trim(DM1.CDSSelecionadosDTFINP.AsString) then
begin
dDataFim := DM1.CDSSelecionadosDTFINP.AsDateTime;
if dDataFim 0 then
if dPercentual > 0 then
MSProject.ActiveProject.Tasks[X].Finish := IncDay(dDataFim) // Incrementa a Duração por causo que o percentual altera na duração
else
MSProject.ActiveProject.Tasks[X].Finish := dDataFim;
end;

//sRecursos := nome do recurso 1[custo do recurso];nome do recurso 2[custo do recurso]...
MSProject.ActiveProject.Tasks[X].ResourceNames := sRecursos;


MSProject.ActiveProject.Tasks[X].PercentComplete := dPercentual;

if (dPercentual > 0) and (dDataFim 0)then
MSProject.ActiveProject.Tasks[X].Finish := dDataFim; // Reatualiza a Data Final. Porque o percentual altera
end;



Responder Citar

04/05/2012

Er Tassara

Obrigado Hélio. Depois que postei, encontrei alguma coisa que pode ajudar, analisando exatamente as propriedades de MSProject_TLB. Abaixo vai um trecho do código que talvez o ajude a entender melhor as várias possibilidades de passar os dados para o MS Project.

while (not (cdsResAjustado.Eof)) do
begin
if cdsResAjustado.FieldByName(item).AsInteger > 26 then // Variável utilizada no programa - nada a ver
flagDeslocamento := true; // Variável utilizada no programa - nada a ver
Timer1.Enabled := false;
Task[i] := MSProject.ActiveProject.Tasks.Add(cdsResAjustado.FieldByName(servico).AsString); // Crio uma atividade baseada nome do "servico".
Task[i].Start := Task[i-1].Finish; // Informo que a data inicial desta tarefa é igual a data final da tarefa anterior
Duracao := Calcula_Duracao; // Função que retorna a duração da tarefa
Task[i].Duration := FloatToStr(Duracao);
Task[i].OutlineLevel := IntToStr(3); // Nível da atividade 1 - Mais alto nível - 5 - Mais baixo (igual a identação que você informou no seu código
if cdsResAjustado.FieldByName(item).AsInteger 4 then
begin
Task[i].ResourceNames := 1 Técnico; 1 Instalador; // Posso entrar também com os recursos da tarefa
if i > 9 then
Task[i].Predecessors := IntToStr(i-1);
end else
begin
Task[i].ResourceNames := Coordenador CMT;
//Task[i].Start := Task[i-1].Start;
end;
cdsResAjustado.Next;
Timer1.Enabled := true;
inc(i);
end;

Espero ter ajudado. Qualquer informação adicional, favor entrar em contato.
Abs,
Responder Citar